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")