{-# Language OverloadedStrings #-} {-# OPTIONS_GHC -Wno-orphans #-} {-| Module : Main Description : Decoder driver for BurntSushi TOML test suite Copyright : (c) Eric Mertens, 2023 License : ISC Maintainer : emertens@gmail.com Decode TOML into JSON for use with -} module Main (main) where import Data.Aeson qualified as Aeson import Data.ByteString.Lazy qualified as BS import Data.Text qualified as Text import Data.Text.IO qualified as Text import Toml (Value(..), Value'(..), parse, Table'(..)) import Toml.Pretty (prettyValue) main :: IO () main = do txt <- Text.getContents case parse txt of Left e -> fail e Right t -> BS.putStr (Aeson.encode t) simple :: Aeson.Key -> String -> Aeson.Value simple ty value = Aeson.object ["type" Aeson..= ty, "value" Aeson..= value] instance Aeson.ToJSON (Toml.Value' a) where toJSON v = case v of Table' _ t -> Aeson.toJSON t List' _ a -> Aeson.toJSON a Text' _ s -> simple "string" (Text.unpack s) Integer' _ _ -> simple "integer" (show (prettyValue v)) Double' _ _ -> simple "float" (show (prettyValue v)) Bool' _ _ -> simple "bool" (show (prettyValue v)) TimeOfDay' _ _ -> simple "time-local" (show (prettyValue v)) ZonedTime' _ _ -> simple "datetime" (show (prettyValue v)) LocalTime' _ _ -> simple "datetime-local" (show (prettyValue v)) Day' _ _ -> simple "date-local" (show (prettyValue v)) instance Aeson.ToJSON (Table' a) where toJSON (MkTable t) = Aeson.toJSON (fmap snd t)