module Text.XML.Decode.Parsers
( parseText
, parseMaybe
, parseInt
, parseInteger
, parseDouble
, parseBool
, parseXmlTime
, parseIsoUtcTime
, parseIsoDay
) where
import Data.Foldable (fold)
import Data.Text (Text, toLower, unpack)
import Data.Time (ParseTime, parseTimeM, defaultTimeLocale)
import Text.Read (readMaybe)
import Text.Read (readMaybe)
import Text.XML.Decode.Time
parseText :: Text -> Either Text Text
parseText = Right
parseMaybe :: Text -> (Text -> Maybe a) -> Text -> Either Text a
parseMaybe desc f t = maybe (Left (fold ["'",t, "' was not ",desc])) Right (f t)
parseInt :: Text -> Either Text Int
parseInt = parseMaybe "an int" (readMaybe . unpack)
parseInteger :: Text -> Either Text Integer
parseInteger = parseMaybe "an integer" (readMaybe . unpack)
parseDouble :: Text -> Either Text Double
parseDouble = parseMaybe "a double" (readMaybe . unpack)
parseBool :: Text -> Either Text Bool
parseBool = parseMaybe "a bool" parseBool' . toLower
where
parseBool' "true" = Just True
parseBool' "false" = Just False
parseBool' _ = Nothing
parseXmlTime :: ParseTime a => Text -> String -> Text -> Either Text a
parseXmlTime desc format =
parseMaybe desc (parseTimeM True defaultTimeLocale format . unpack)
parseIsoUtcTime :: Text -> Either Text IsoUTCTime
parseIsoUtcTime =
fmap IsoUTCTime . parseXmlTime "UTCTime" isoUTCTimeFormat
parseIsoDay :: Text -> Either Text IsoDay
parseIsoDay = fmap IsoDay . parseXmlTime "UTCDay" isoDayFormat