packages feed

hurl-workbench-core-0.1.0.0: src/HurlWorkbench/Check/Template.hs

-- | Exact {{parameter}} placeholders. Substitution preserves argv boundaries.
module HurlWorkbench.Check.Template (TemplatePart (..), parseTemplate) where

import Data.Text qualified as Text
import HurlWorkbench.Prelude
import HurlWorkbench.Workspace.Types (ParameterName (..))

data TemplatePart = Literal !Text | Placeholder !ParameterName
  deriving stock (Eq, Show)

parseTemplate :: Text -> Either Text [TemplatePart]
parseTemplate = go
  where
    go remaining = case Text.breakOn "{{" remaining of
      (prefix, rest)
        | "}}" `Text.isInfixOf` prefix -> malformed
        | Text.null rest -> Right [Literal prefix]
        | otherwise ->
            let (name, close) = Text.breakOn "}}" (Text.drop 2 rest)
             in if Text.null close || Text.null name || Text.any (`elem` ['{', '}']) name
                  then malformed
                  else (Literal prefix :) . (Placeholder (ParameterName name) :) <$> go (Text.drop 2 close)
    malformed = Left "malformed parameter placeholder"