module DisTract.BugFileInputLoader
(parseForNewBug,
parseForBugUpdate
)
where
import DisTract.Types
import DisTract.Parsers
import DisTract.Utils
import qualified Data.Map as M
import qualified JSON as J
import Control.Monad
parseForNewBug :: FilePath -> IO (Maybe (String, M.Map String J.Value))
parseForNewBug file
= do { textJson <- readFileStrict file
; case J.parse textJson of
(Just (J.Object obj)) ->
return $ Just (comment, fields)
where
commentM = M.lookup "text" obj
fieldsM = M.lookup "fields" obj
comment = case commentM of
(Just (J.String txt)) -> txt
_ -> ""
fields = case fieldsM of
(Just (J.Object objFields)) -> objFields
_ -> M.empty
_ -> return Nothing
}
parseForBugUpdate :: FilePath -> IO (Maybe (BugId, Maybe (String, String), M.Map String J.Value))
parseForBugUpdate file
= do { textJson <- readFile file
; case J.parse textJson of
(Just (J.Object obj)) -> return $ fmap (\bugId -> (bugId, comment, fields)) bid
where
bidM = M.lookup "bugId" obj
commentM = M.lookup "comment" obj
fieldsM = M.lookup "fields" obj
bid = join . fmap findBugIdJson $ bidM
comment' = case commentM of
(Just (J.Object cObj)) ->
liftM2 (,) txtM inReplyToM
where
txtM = M.lookup "text" cObj
inReplyToM = M.lookup "inReplyTo" cObj
_ -> Nothing
comment = join . fmap commentBuilder $ comment'
commentBuilder :: (J.Value, J.Value) -> Maybe (String, String)
commentBuilder ((J.String txt), (J.String inReplyTo)) = Just (txt, inReplyTo)
commentBuilder _ = Nothing
fields = case fieldsM of
(Just (J.Object objFields)) -> objFields
_ -> M.empty
_ -> return Nothing
}
findBugIdJson :: J.Value -> Maybe BugId
findBugIdJson (J.String txt) = case result of
(Left _) -> Nothing
(Right r) -> Just r
where
result = findBugId txt
findBugIdJson _ = Nothing