-- | Haskell re-implementation of [cfn_flip](https://github.com/awslabs/aws-cfn-template-flip/blob/837aa56e21cb00b1c7fa0150f0fd38365c508e4e/cfn_flip/yaml_dumper.py)
module CfnFlip
  ( yamlFileToJson
  , yamlToJson
  , jsonToYamlFile
  , jsonFileToYaml
  , jsonToYaml
  ) where

import CfnFlip.Prelude

import CfnFlip.Aeson
import qualified CfnFlip.JsonToYaml as JsonToYaml
import qualified CfnFlip.Yaml as Yaml
import qualified CfnFlip.YamlToJson as YamlToJson

-- | Read a file of Yaml and produce a @'FromJSON' a@
yamlFileToJson :: (MonadIO m, FromJSON a) => FilePath -> m a
yamlFileToJson :: FilePath -> m a
yamlFileToJson = ByteString -> m a
forall (m :: * -> *) a.
(MonadIO m, FromJSON a) =>
ByteString -> m a
yamlToJson (ByteString -> m a)
-> (FilePath -> m ByteString) -> FilePath -> m a
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< FilePath -> m ByteString
forall (m :: * -> *). MonadIO m => FilePath -> m ByteString
readFileBinary

-- | Convert a 'ByteString' of Yaml to a @'FromJSON' a@
yamlToJson :: (MonadIO m, FromJSON a) => ByteString -> m a
yamlToJson :: ByteString -> m a
yamlToJson = ConduitM Event Event Parse () -> ByteString -> m a
forall (m :: * -> *) a.
(MonadIO m, FromJSON a) =>
ConduitM Event Event Parse () -> ByteString -> m a
Yaml.decode ConduitM Event Event Parse ()
forall (m :: * -> *). MonadIO m => ConduitT Event Event m ()
YamlToJson.translate

-- | Write a @'ToJSON a@ to a file as Yaml
jsonToYamlFile :: (MonadUnliftIO m, ToJSON a) => FilePath -> a -> m ()
jsonToYamlFile :: FilePath -> a -> m ()
jsonToYamlFile FilePath
path = FilePath -> ByteString -> m ()
forall (m :: * -> *). MonadIO m => FilePath -> ByteString -> m ()
writeFileBinary FilePath
path (ByteString -> m ()) -> (a -> m ByteString) -> a -> m ()
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< a -> m ByteString
forall (m :: * -> *) a.
(MonadUnliftIO m, ToJSON a) =>
a -> m ByteString
jsonToYaml

-- | Read a file of JSON and produce a 'ByteString' of Yaml
--
-- NB. The conversion occurs at 'Value'.
--
jsonFileToYaml :: MonadUnliftIO m => FilePath -> m ByteString
jsonFileToYaml :: FilePath -> m ByteString
jsonFileToYaml = (MonadUnliftIO m, ToJSON Value) => Value -> m ByteString
forall (m :: * -> *) a.
(MonadUnliftIO m, ToJSON a) =>
a -> m ByteString
jsonToYaml @_ @Value (Value -> m ByteString)
-> (FilePath -> m Value) -> FilePath -> m ByteString
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< FilePath -> m Value
forall (m :: * -> *) a. (MonadIO m, FromJSON a) => FilePath -> m a
eitherDecodeFileStrictThrow

-- | Convert a 'ToJSON a' to a 'ByteString' of Yaml
jsonToYaml :: (MonadUnliftIO m, ToJSON a) => a -> m ByteString
jsonToYaml :: a -> m ByteString
jsonToYaml = ConduitT Event Event (ResourceT m) () -> a -> m ByteString
forall (m :: * -> *) a.
(MonadUnliftIO m, ToJSON a) =>
ConduitT Event Event (ResourceT m) () -> a -> m ByteString
Yaml.encode ConduitT Event Event (ResourceT m) ()
forall (m :: * -> *). MonadIO m => ConduitT Event Event m ()
JsonToYaml.translate