packages feed

scrod-0.2026.2.21: source/library/Scrod/Xml/Comment.hs

{-# LANGUAGE TemplateHaskellQuotes #-}

module Scrod.Xml.Comment where

import qualified Data.ByteString.Builder as Builder
import qualified Data.Text as Text
import qualified Scrod.Extra.Builder as Builder
import qualified Scrod.Extra.Semigroup as Semigroup
import qualified Scrod.Spec as Spec

-- | XML Comment like @\<!-- comment text -->@. Cannot contain @-->@.
newtype Comment = MkComment
  { unwrap :: Text.Text
  }
  deriving (Eq, Ord, Show)

encode :: Comment -> Builder.Builder
encode =
  Semigroup.around (Builder.stringUtf8 "<!--") (Builder.stringUtf8 "-->")
    . Builder.stringUtf8
    . Text.unpack
    . unwrap

spec :: (Applicative m, Monad n) => Spec.Spec m n -> n ()
spec s = do
  Spec.named s 'encode $ do
    Spec.it s "encodes empty comment" $ do
      Spec.assertEq s (Builder.toString . encode . MkComment $ Text.pack "") "<!---->"

    Spec.it s "encodes comment with text" $ do
      Spec.assertEq s (Builder.toString . encode . MkComment $ Text.pack " hello ") "<!-- hello -->"

    Spec.it s "encodes comment with special chars" $ do
      Spec.assertEq s (Builder.toString . encode . MkComment $ Text.pack " & ") "<!-- & -->"