{-# LANGUAGE DerivingStrategies #-} {-# LANGUAGE QuantifiedConstraints #-} {-# LANGUAGE ImpredicativeTypes #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE AllowAmbiguousTypes #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE UndecidableInstances #-} module Conftrack.Source.Yaml (YamlSource(..), mkYamlSource, mkYamlSourceWith, mkYamlFileSource) where import Conftrack.Source (SomeSource(..), ConfigSource (..)) import Conftrack.Source.Aeson import Prelude hiding (readFile) import qualified Data.Aeson as A import qualified Data.Yaml as Y import Data.Text (Text) import qualified Data.Aeson.Text as A import qualified Data.Text.Lazy as LT import Data.Functor ((<&>)) import System.OsPath (OsPath) import qualified System.OsPath as OS import System.File.OsPath (readFile) import qualified Data.ByteString as BS newtype YamlSource = YamlSource JsonSource deriving newtype (ConfigSource, Show) mkYamlSource :: A.Value -> SomeSource mkYamlSource value = mkYamlSourceWith ("Yaml string " <> LT.toStrict (A.encodeToLazyText value)) value mkYamlSourceWith :: Text -> A.Value -> SomeSource mkYamlSourceWith description value = SomeSource (source, []) where source = YamlSource (JsonSource value description) mkYamlFileSource :: OsPath -> IO (Either Y.ParseException SomeSource) mkYamlFileSource path = do bytes <- readFile path <&> BS.toStrict pathAsText <- OS.decodeUtf path <&> LT.toStrict . LT.pack pure $ Y.decodeEither' bytes <&> mkYamlSourceWith ("YAML file " <> pathAsText)