packages feed

mdoc-0.2.0.0: src/Mdoc/Data/Argument.hs

-- |
--
-- Module      : Mdoc.Data.Argument
-- Copyright   : (c) 2026 Patrick Brisbin
-- License     : AGPL-3
-- Maintainer  : pbrisbin@gmail.com
-- Stability   : experimental
-- Portability : POSIX
module Mdoc.Data.Argument
  ( Argument (..)
  , ShortArg (..)
  , LongArg (..)
  ) where

import Mdoc.Prelude

import Data.Text qualified as T
import Mdoc.Data.Optionality
import Mdoc.Pretty
import Mdoc.Syntax

data Argument = Argument
  { index :: Int
  , schema :: String
  , optionality :: Optionality
  }
  deriving stock (Eq, Ord, Show)
  deriving (ToJSON) via (Rendered Argument)

instance IsString Argument where
  fromString schema =
    Argument
      { index = 0
      , schema
      , optionality = Required
      }

instance Pretty Argument where
  pretty Argument {schema, optionality} = case optionality of
    Required -> "Ar" <+> pretty schema
    _ -> "Op Ar" <+> pretty schema

data ShortArg = ShortArg
  { name :: Char
  , argument :: Argument
  }

instance Pretty ShortArg where
  pretty (ShortArg {name, argument}) =
    prefix (pretty $ esc $ T.singleton name)
      <+> pretty Ar
      <+> pretty argument.schema
   where
    prefix :: Doc ann -> Doc ann
    prefix = case argument.optionality of
      Required -> id
      _ -> (<+> "Op")

data LongArg = LongArg
  { name :: String
  , argument :: Argument
  }

instance Pretty LongArg where
  pretty LongArg {name, argument} =
    prefix (pretty (esc $ pack name))
      <+> pretty Ns
      <+> pretty Ar
      <+> pretty argument.schema
   where
    prefix :: Doc ann -> Doc ann
    prefix = case argument.optionality of
      Required -> (<> "=")
      _ -> (<+> "Ns Op Cm")