module Autodocodec.Nix.Render
  ( toNixExpressionViaCodec,
    toNixExpressionVia,
    objectToNixExpressionViaCodec,
    objectToNixExpressionVia,
    renderExpression,
  )
where

import Autodocodec
import Autodocodec.Nix.Expression as Nix
import Data.Map (Map)
import Data.Text (Text)

toNixExpressionViaCodec :: (HasCodec a) => a -> Nix.Expression
toNixExpressionViaCodec :: forall a. HasCodec a => a -> Expression
toNixExpressionViaCodec = ValueCodec a a -> a -> Expression
forall a void. ValueCodec a void -> a -> Expression
toNixExpressionVia ValueCodec a a
forall value. HasCodec value => JSONCodec value
codec

-- | Render a value as a nix expression via the given codec.
toNixExpressionVia :: ValueCodec a void -> a -> Nix.Expression
toNixExpressionVia :: forall a void. ValueCodec a void -> a -> Expression
toNixExpressionVia ValueCodec a void
c = Value -> Expression
jsonValueExpression (Value -> Expression) -> (a -> Value) -> a -> Expression
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ValueCodec a void -> a -> Value
forall a void. ValueCodec a void -> a -> Value
toJSONVia ValueCodec a void
c

-- | Render an object as a nix attribute set via its 'HasObjectCodec' instance
--
-- Attrset
objectToNixExpressionViaCodec :: (HasObjectCodec a) => a -> Map Text Nix.Expression
objectToNixExpressionViaCodec :: forall a. HasObjectCodec a => a -> Map Text Expression
objectToNixExpressionViaCodec = ObjectCodec a a -> a -> Map Text Expression
forall a void. ObjectCodec a void -> a -> Map Text Expression
objectToNixExpressionVia ObjectCodec a a
forall object. HasObjectCodec object => JSONObjectCodec object
objectCodec

-- | Render an object as a nix attribute set via the given object codec.
--
-- Attrset
objectToNixExpressionVia :: ObjectCodec a void -> a -> Map Text Nix.Expression
objectToNixExpressionVia :: forall a void. ObjectCodec a void -> a -> Map Text Expression
objectToNixExpressionVia ObjectCodec a void
c = Object -> Map Text Expression
jsonObjectExpression (Object -> Map Text Expression)
-> (a -> Object) -> a -> Map Text Expression
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ObjectCodec a void -> a -> Object
forall a void. ObjectCodec a void -> a -> Object
toJSONObjectVia ObjectCodec a void
c