packages feed

mdoc-0.1.0.0: src/Mdoc/Gen/Man1.hs

-- |
--
-- Module      : Mdoc.Gen.Man1
-- Copyright   : (c) 2026 Patrick Brisbin
-- License     : AGPL-3
-- Maintainer  : pbrisbin@gmail.com
-- Stability   : experimental
-- Portability : POSIX
module Mdoc.Gen.Man1
  ( Man1 (..)
  , baseMan1

    -- * Manual modification
  , addFile
  , addCrossRef
  , addExitStatus
  ) where

import Mdoc.Prelude

import Mdoc.Gen.Argument
import Mdoc.Gen.CrossRef
import Mdoc.Gen.Described
import Mdoc.Gen.EnvVar
import Mdoc.Gen.ExitStatus
import Mdoc.Gen.File
import Mdoc.Gen.Flag
import Mdoc.Gen.Name
import Mdoc.Gen.Option
import Mdoc.Optics

data Man1 = Man1
  { name :: Name
  , switches :: [Described Flag]
  , options :: [Described Option]
  , arguments :: [Described Argument]
  , environment :: [Described EnvVar]
  , files :: [File]
  , exitStatus :: Maybe (NonEmpty NonZeroStatus)
  , seeAlso :: [CrossRef]
  }
  deriving stock (Eq, Generic, Show)

baseMan1 :: String -> String -> Man1
baseMan1 name nameDescription =
  Man1
    { name =
        Name
          { primary = name
          , secondaries = []
          , description = nameDescription
          }
    , switches = []
    , options = []
    , arguments = []
    , environment = []
    , files = []
    , exitStatus = Nothing
    , seeAlso = []
    }

addFile :: FilePath -> Maybe String -> Man1 -> Man1
addFile path description = field @"files" <>~ [File {path, description}]

addCrossRef :: String -> Int -> Man1 -> Man1
addCrossRef name section = field @"seeAlso" <>~ [CrossRef {name, section}]

addExitStatus :: NonZeroStatus -> Man1 -> Man1
addExitStatus nz = field @"exitStatus" %~ Just . maybe (pure nz) (<> pure nz)