packages feed

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