module OpcXmlDaClient.XmlSchemaValues.Rendering
  ( dateTime,
    time,
    date,
    duration,
  )
where

import qualified Data.Time.Format.ISO8601 as Iso8601
import OpcXmlDaClient.Base.Prelude
import OpcXmlDaClient.XmlSchemaValues.Types
import Text.Builder

dateTime :: UTCTime -> Builder
dateTime :: UTCTime -> Builder
dateTime = UTCTime -> Builder
forall a. ISO8601 a => a -> Builder
iso8601Show

time :: Time -> Builder
time :: Time -> Builder
time (Time TimeOfDay
a Maybe TimeZone
b) = TimeOfDay -> Builder
forall a. ISO8601 a => a -> Builder
iso8601Show TimeOfDay
a Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> (TimeZone -> Builder) -> Maybe TimeZone -> Builder
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap TimeZone -> Builder
forall a. ISO8601 a => a -> Builder
iso8601Show Maybe TimeZone
b

date :: Date -> Builder
date :: Date -> Builder
date (Date Day
a Maybe TimeZone
b) = Day -> Builder
forall a. ISO8601 a => a -> Builder
iso8601Show Day
a Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> (TimeZone -> Builder) -> Maybe TimeZone -> Builder
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap TimeZone -> Builder
forall a. ISO8601 a => a -> Builder
iso8601Show Maybe TimeZone
b

duration :: Duration -> Builder
duration :: Duration -> Builder
duration (Duration Bool
a CalendarDiffTime
b) = (Builder -> Builder)
-> (Builder -> Builder) -> Bool -> Builder -> Builder
forall a. a -> a -> Bool -> a
bool (Builder -> Builder -> Builder
forall a. Monoid a => a -> a -> a
mappend Builder
"-") Builder -> Builder
forall k (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id Bool
a (Builder -> Builder) -> Builder -> Builder
forall a b. (a -> b) -> a -> b
$ CalendarDiffTime -> Builder
forall a. ISO8601 a => a -> Builder
iso8601Show CalendarDiffTime
b

iso8601Show :: Iso8601.ISO8601 a => a -> Builder
iso8601Show :: a -> Builder
iso8601Show = String -> Builder
forall a. IsString a => String -> a
fromString (String -> Builder) -> (a -> String) -> a -> Builder
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. a -> String
forall t. ISO8601 t => t -> String
Iso8601.iso8601Show