yaml-marked-0.2.0.0: src/Data/Yaml/Marked/Value.hs
module Data.Yaml.Marked.Value
( Value (..)
, MarkedObject
, MarkedArray
, valueAsJSON
, valueToValue
) where
import Prelude
import Data.Aeson (FromJSON (..))
import qualified Data.Aeson as Aeson
import Data.Aeson.Compat (parseEither)
import Data.Aeson.Compat.KeyMap (KeyMap)
import Data.Scientific (Scientific)
import Data.Text (Text)
import Data.Vector (Vector)
import Data.Yaml.Marked
data Value
= Object !MarkedObject
| Array !MarkedArray
| String !Text
| Number !Scientific
| Bool !Bool
| Null
deriving stock (Eq, Show)
type MarkedObject = KeyMap (Marked Value)
type MarkedArray = Vector (Marked Value)
-- | Parse the value using its 'FromJSON', discarding any marks
valueAsJSON :: FromJSON a => Value -> Either String a
valueAsJSON = parseEither parseJSON . valueToValue
-- | Convert a 'Value' to an equivalent 'Data.Aeson.Value'
valueToValue :: Value -> Aeson.Value
valueToValue = \case
Object km -> Aeson.Object $ valueToValue . markedItem <$> km
Array v -> Aeson.Array $ valueToValue . markedItem <$> v
String x -> Aeson.String x
Number x -> Aeson.Number x
Bool x -> Aeson.Bool x
Null -> Aeson.Null