packages feed

hydra-0.14.0: src/gen-main/haskell/Hydra/Json/Yaml/Decode.hs

-- Note: this is an automatically generated file. Do not edit.

-- | YAML-to-JSON decoding. Converts YAML Nodes to JSON Values (may fail for non-JSON YAML), and YAML Nodes to Hydra Terms via JSON.

module Hydra.Json.Yaml.Decode where

import qualified Hydra.Core as Core
import qualified Hydra.Ext.Org.Yaml.Model as Model
import qualified Hydra.Json.Decode as Decode
import qualified Hydra.Json.Model as Model_
import qualified Hydra.Lib.Eithers as Eithers
import qualified Hydra.Lib.Literals as Literals
import qualified Hydra.Lib.Maps as Maps
import qualified Hydra.Lib.Pairs as Pairs
import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
import qualified Data.ByteString as B
import qualified Data.Int as I
import qualified Data.List as L
import qualified Data.Map as M
import qualified Data.Set as S

-- | Decode a YAML node to a Hydra term via JSON decoding.
fromYaml :: M.Map Core.Name Core.Type -> Core.Name -> Core.Type -> Model.Node -> Either String Core.Term
fromYaml types tname typ node =

      let jsonResult = yamlToJson node
      in (Eithers.either (\err -> Left err) (\json -> Decode.fromJson types tname typ json) jsonResult)

-- | Convert a YAML node to a JSON value. Fails for non-JSON YAML features (e.g. non-string mapping keys).
yamlToJson :: Model.Node -> Either String Model_.Value
yamlToJson node =
    case node of
      Model.NodeMapping v0 ->
        let convertEntry =
                \kv ->
                  let keyNode = Pairs.first kv
                      valNode = Pairs.second kv
                      keyResult =
                              case keyNode of
                                Model.NodeScalar v1 -> case v1 of
                                  Model.ScalarStr v2 -> Right v2
                                  _ -> Left "non-string YAML mapping key"
                                _ -> Left "non-scalar YAML mapping key"
                  in (Eithers.either (\err -> Left err) (\key ->
                    let valResult = yamlToJson valNode
                    in (Eithers.map (\v -> (key, v)) valResult)) keyResult)
            entries = Eithers.mapList convertEntry (Maps.toList v0)
        in (Eithers.map (\es -> Model_.ValueObject (Maps.fromList es)) entries)
      Model.NodeScalar v0 -> case v0 of
        Model.ScalarBool v1 -> Right (Model_.ValueBoolean v1)
        Model.ScalarFloat v1 -> Right (Model_.ValueNumber v1)
        Model.ScalarInt v1 -> Right (Model_.ValueNumber (Literals.bigintToBigfloat v1))
        Model.ScalarNull -> Right Model_.ValueNull
        Model.ScalarStr v1 -> Right (Model_.ValueString v1)
      Model.NodeSequence v0 ->
        let results = Eithers.mapList (\n -> yamlToJson n) v0
        in (Eithers.map (\vs -> Model_.ValueArray vs) results)