opc-xml-da-client-0.1.2: library/OpcXmlDaClient/XmlSchemaValues/Attoparsec.hs
module OpcXmlDaClient.XmlSchemaValues.Attoparsec
( dateTime,
time,
date,
duration,
)
where
import qualified Attoparsec.Data as Ad
import Data.Attoparsec.Text
import qualified Data.Text as Text
import qualified Data.Time.Format.ISO8601 as Iso8601
import OpcXmlDaClient.Base.Prelude
import OpcXmlDaClient.XmlSchemaValues.Types
import qualified OpcXmlDaClient.XmlSchemaValues.Util.TimeMath as TimeMath
-- |
-- XML Schema dateTime.
--
-- https://www.w3.org/TR/xmlschema-2/#dateTime
dateTime :: Parser UTCTime
dateTime = Ad.utcTimeInISO8601
-- |
-- XML Schema time.
--
-- https://www.w3.org/TR/xmlschema-2/#time
time :: Parser Time
time = do
_timeOfDay <- Ad.timeOfDayInISO8601
_timeZone <- optional Ad.timeZoneInISO8601
return $ Time _timeOfDay _timeZone
-- |
-- XML Schema date.
--
-- https://www.w3.org/TR/xmlschema-2/#date
date :: Parser Date
date = do
_applyNeg <- fmap TimeMath.negateDay <$ char '-' <|> pure id
_day <- _applyNeg Ad.dayInISO8601
_timeZone <- optional Ad.timeZoneInISO8601
return $ Date _day _timeZone
-- |
-- XML Schema duration.
--
-- https://www.w3.org/TR/xmlschema-2/#duration
duration :: Parser Duration
duration = do
_pos <- False <$ char '-' <|> pure True
_textRemainder <- takeText
_diff <- Iso8601.iso8601ParseM $ Text.unpack _textRemainder
return $ Duration _pos _diff