packages feed

ipldm-1.0.0.0: dagcbor/IPLD/DagCBOR/Encoder/Strings.hs

-- | Module      : IPLD.DagCBOR.Encoder.Strings
--   Description : DAG-CBOR encoders for strings, bytes, lists and maps
--   Copyright   : Zoey McBride (c) 2026
--   License     : AGPL-3.0-or-later
--   Maintainer  : zoeymcbride@mailbox.org
--   Stability   : experimental
module IPLD.DagCBOR.Encoder.Strings
  ( -- * DAG-CBOR encoder for bytestrings
    encodeBytesKind,
    majorBytes,

    -- * DAG-CBOR encoder for UTF-8 strings
    encodeStringKind,
    majorString,
  )
where

import Data.ByteString qualified as Bytes
import Data.ByteString.Builder (Builder)
import Data.ByteString.Builder qualified as BSB
import Data.Text (Text)
import Data.Text.Encoding qualified as Text
import IPLD.DM qualified as DM
import IPLD.DagCBOR.Encoder.Arguments
import IPLD.DagCBOR.Encoder.Errors
import IPLD.DagCBOR.Encoder.Ints

-- | Major id for CBOR bytestrings.
majorBytes :: MajorArg
majorBytes = 2

-- | Encodes a CBOR bytesring.
{-# INLINE encodeBytesKind #-}
encodeBytesKind :: DM.BytesData -> Okay Builder
encodeBytesKind (DM.BytesData bsb len) =
  let -- Get the argument builder for CBOR bytestrings
      arg = encodeIntArgument majorBytes len
   in -- Concat the argument and the bytestring builder
      arg <<>> pure bsb

-- | Major id for CBOR UTF-8 strings.
majorString :: MajorArg
majorString = 3

-- | Encodes a CBOR UTF-8 string.
{-# INLINE encodeStringKind #-}
encodeStringKind :: Text -> Okay Builder
encodeStringKind text =
  let -- Generates a UTF-8 encoded bytestring and get the builder and length
      utf = Text.encodeUtf8 text
      bsb = BSB.byteString utf
      len = Bytes.length utf
      -- Get the argument builder for CBOR UTF-8 strings
      arg = encodeIntArgument majorString len
   in -- Concat the argument and the bytestring builder
      arg <<>> pure bsb