{-# LANGUAGE TemplateHaskell #-}
import Data.Yaml.Pretty.Extras
import GHC.Generics
import Lens.Micro.Platform hiding ((.=))
import RIO
import qualified RIO.ByteString as BS
import Test.Hspec
data Person = Person {
_mood :: Text,
_job :: Text
} deriving (Eq, Generic, Show)
instance FromJSON Person where
parseJSON (Object v) = Person
<$> v .: "mood"
<*> v .: "job"
instance ToJSON Person where
toJSON x = object ["mood" .= _mood x, "job" .= _job x]
$(makeLenses ''Person)
data Conf = Conf {
_name :: Text,
_kind :: Text,
_people :: [Person]
} deriving (Eq, Generic, Show)
instance FromJSON Conf where
parseJSON (Object v) = Conf
<$> v .: "name"
<*> v .: "kind"
<*> v .: "people"
instance ToJSON Conf where
toJSON x = object ["name" .= _name x, "kind" .= _kind x, "people" .= _people x]
$(makeLenses ''Conf)
instance ToPrettyYaml Conf where
fieldOrder = const ["name", "kind", "people", "mood", "job"]
main :: IO ()
main = hspec $ describe "Data.Yaml.Pretty.Extras" $ it "prints correctly" $ do
Just x <- decodeFileThrow "test/mock.yaml" :: IO (Maybe Conf)
BS.readFile "test/mock.yaml" `shouldReturn` toPrettyYaml x