packages feed

argo-0.2022.2.2: source/library/Argo/Encode.hs

module Argo.Encode where

import qualified Argo.Class.HasCodec as HasCodec
import qualified Argo.Codec.Value as Codec
import qualified Argo.Json.Value as Value
import qualified Argo.Literal as Literal
import qualified Argo.Pointer.Pointer as Pointer
import qualified Argo.Type.Config as Config
import qualified Argo.Type.Encoder as Encoder
import qualified Argo.Type.Indent as Indent
import qualified Argo.Vendor.Builder as Builder
import qualified Argo.Vendor.Transformers as Trans
import qualified Control.Monad as Monad

encode :: HasCodec.HasCodec a => a -> Builder.Builder
encode = encodeWith $ Indent.Spaces 0

encodeWith :: HasCodec.HasCodec a => Indent.Indent -> a -> Builder.Builder
encodeWith i x =
    let c = Config.initial { Config.indent = i }
    in
        Encoder.run c $ do
            Value.encode $ Codec.encodeWith HasCodec.codec x
            Monad.when (Config.hasIndent c)
                . Trans.lift
                . Trans.tell
                $ Builder.word8 Literal.newLine

encodePointer :: Pointer.Pointer -> Builder.Builder
encodePointer = Encoder.run Config.initial . Pointer.encode