tomland-0.5.0: benchmark/Benchmark/HtomlMegaparsec.hs
{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# LANGUAGE PackageImports #-}
module Benchmark.HtomlMegaparsec
( convert
, decode
, parse
) where
import Data.Aeson.Types (ToJSON, parseEither, parseJSON, toJSON)
import Data.Text (Text)
import "htoml-megaparsec" Text.Toml (Node (..), Table, TomlError, parseTomlDoc)
import Benchmark.Type (HaskellType)
-- | Wrapper on htoml-megaparsec's parseTomlDoc
parse :: Text -> Either TomlError Table
parse = parseTomlDoc "log"
-- | Convert from already parsed toml to Haskell type.
convert :: Table -> Either String HaskellType
convert = parseEither parseJSON . toJSON
-- | Decode toml file to Haskell type.
decode :: Text -> Either String HaskellType
decode txt = case parseTomlDoc "log" txt of
Left _ -> error "Parsing failed"
Right toml -> convert toml
-- | 'ToJSON' instances for the 'Node' type that produce Aeson (JSON)
-- in line with the TOML specification.
instance ToJSON Node where
toJSON (VTable v) = toJSON v
toJSON (VTArray v) = toJSON v
toJSON (VString v) = toJSON v
toJSON (VInteger v) = toJSON v
toJSON (VFloat v) = toJSON v
toJSON (VBoolean v) = toJSON v
toJSON (VDatetime v) = toJSON v
toJSON (VArray v) = toJSON v