packages feed

jsonnet-0.1.0.0: src/Language/Jsonnet/Manifest.hs

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}

-- |
module Language.Jsonnet.Manifest where

import Control.Monad.Except
import Data.Aeson (FromJSON (..))
import qualified Data.Aeson as JSON
import Data.HashMap.Lazy (HashMap)
import qualified Data.HashMap.Lazy as H
import Data.Text (Text)
import Data.Vector (Vector)
import Debug.Trace
import Language.Jsonnet.Common
import Language.Jsonnet.Error
import Language.Jsonnet.Eval.Monad
import Language.Jsonnet.Value

manifest :: Value -> Eval JSON.Value
manifest =
  \case
    VNull -> pure JSON.Null
    VBool b -> pure $ JSON.Bool b
    VNum n -> pure $ JSON.Number n
    VStr s -> pure $ JSON.String s
    VArr a -> JSON.Array <$> forceArray a
    VObj o -> JSON.Object <$> forceObject o
    VClos {} -> throwE (ManifestError "function")
    VFun _ -> throwE (ManifestError "function")

forceArray :: Vector Thunk -> Eval (Vector JSON.Value)
forceArray = traverse (force >=> manifest)

forceObject :: Object -> Eval (HashMap Text JSON.Value)
forceObject = traverse (force >=> manifest) . visibleKeys

visibleKeys :: Object -> HashMap Text Thunk
visibleKeys o =
  H.fromList [(k, v) | (k, vv@(Hideable v _)) <- xs, not (hidden vv)]
  where
    xs = H.toList o