packages feed

network-uri-template-0.1.0.0: src/Network/URI/Template/Internal.hs

-- |
--
-- Module      : Network.URI.Template.Internal
-- Copyright   : (c) 2025 Patrick Brisbin
-- License     : AGPL-3
-- Maintainer  : pbrisbin@gmail.com
-- Stability   : experimental
-- Portability : POSIX
module Network.URI.Template.Internal
  ( Template (..)
  , templateP
  , templatePretty
  , variableP
  , variablePretty
  , module Network.URI.Template.Internal.Expression
  , module Network.URI.Template.Internal.Modifier
  , module Network.URI.Template.Internal.Operator
  , module Network.URI.Template.Internal.TemplatePart
  , module Network.URI.Template.Internal.VarSpec
  ) where

import Prelude

import Data.Map.Strict (Map)
import Data.Map.Strict qualified as Map
import Network.URI.Template.Internal.Expression
import Network.URI.Template.Internal.Modifier
import Network.URI.Template.Internal.Operator
import Network.URI.Template.Internal.Parse
import Network.URI.Template.Internal.Pretty
import Network.URI.Template.Internal.TemplatePart
import Network.URI.Template.Internal.VarSpec
import Network.URI.Template.VarName
import Network.URI.Template.VarValue

newtype Template = Template
  { unwrap :: [TemplatePart]
  }
  deriving stock (Eq, Show)

templateP :: Parser Template
templateP = Template <$> some templatePartP

templatePretty :: Template -> Doc Ann
templatePretty = mconcat . map templatePartPretty . (.unwrap)

-- | Parse one @name := value@ assignment
variableP :: Parser (Map VarName VarValue)
variableP =
  Map.singleton
    <$> varNameP
    <*> (hspace *> string ":=" *> hspace *> varValueP)

-- | Prettyprint a variable and value, 'fill'ing the name to the given width
variablePretty :: Int -> VarName -> VarValue -> Doc Ann
variablePretty w n v =
  hsep
    [ fill w $ varNamePretty n
    , annotate AnnPunctuation ":="
    , varValuePretty v
    ]