packages feed

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

-- |
--
-- Module      : Network.URI.Template.Internal.TemplatePart
-- Copyright   : (c) 2025 Patrick Brisbin
-- License     : AGPL-3
-- Maintainer  : pbrisbin@gmail.com
-- Stability   : experimental
-- Portability : POSIX
module Network.URI.Template.Internal.TemplatePart
  ( TemplatePart (..)
  , templatePartP
  , templatePartPretty
  ) where

import Prelude

import Data.Text (Text, pack)
import Network.URI.Template.Internal.Expression
import Network.URI.Template.Internal.Parse
import Network.URI.Template.Internal.Pretty

data TemplatePart
  = Lit Text
  | Exp Expression
  deriving stock (Eq, Show)

templatePartP :: Parser TemplatePart
templatePartP =
  choice
    [ Exp <$> expressionP <?> "template expression"
    , Lit . pack <$> some litChar <?> "template literal"
    ]
 where
  litChar :: Parser Char
  litChar = noneOf ['\r', '\n', '\t', ' ', '{']

templatePartPretty :: TemplatePart -> Doc Ann
templatePartPretty = \case
  Lit t -> pretty t
  Exp e -> expressionPretty e