44 lines
1.5 KiB
Haskell
44 lines
1.5 KiB
Haskell
{-# LANGUAGE FlexibleContexts #-}
|
|
{-# LANGUAGE LambdaCase #-}
|
|
|
|
module Nix.Json where
|
|
|
|
import Control.Monad
|
|
import Control.Monad.Trans
|
|
import qualified Data.Aeson as A
|
|
import qualified Data.Aeson.Encoding as A
|
|
import qualified Data.Text as Text
|
|
import qualified Data.Text.Lazy as TL
|
|
import qualified Data.Text.Lazy.Encoding as TL
|
|
import qualified Data.Vector as V
|
|
import Nix.Atoms
|
|
import Nix.Effects
|
|
import Nix.Exec
|
|
import Nix.Frames
|
|
import Nix.String
|
|
import Nix.Thunk
|
|
import Nix.Utils
|
|
import Nix.Value
|
|
|
|
nvalueToJSONNixString :: MonadNix e m => NValue m -> m NixString
|
|
nvalueToJSONNixString = runWithStringContextT
|
|
. fmap (TL.toStrict . TL.decodeUtf8 . A.encodingToLazyByteString . toEncodingSorted)
|
|
. nvalueToJSON
|
|
|
|
nvalueToJSON :: MonadNix e m => NValue m -> WithStringContextT m A.Value
|
|
nvalueToJSON = \case
|
|
NVConstant (NInt n) -> pure $ A.toJSON n
|
|
NVConstant (NFloat n) -> pure $ A.toJSON n
|
|
NVConstant (NBool b) -> pure $ A.toJSON b
|
|
NVConstant NNull -> pure $ A.Null
|
|
NVStr ns -> A.toJSON <$> extractNixString ns
|
|
NVList l ->
|
|
A.Array . V.fromList <$> traverse (join . lift . flip force (return . nvalueToJSON)) l
|
|
NVSet m _ ->
|
|
A.Object <$> traverse (join . lift . flip force (return . nvalueToJSON)) m
|
|
NVPath p -> do
|
|
fp <- lift $ unStorePath <$> addPath p
|
|
addSingletonStringContext $ StringContext (Text.pack fp) DirectPath
|
|
return $ A.toJSON fp
|
|
v -> lift $ throwError $ CoercionToJson v
|