packages feed

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

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

    -- * Adding to @SYNOPSIS@ / @DESCRIPTION@
  , addSwitch
  , addOption
  , addArgument
  , addConfig

    -- * @ENVIRONMENT@
  , addEnvVar

    -- * Other, rarel-used elements
  , setSynopsis
  , setPrologue
  , setEpilogue
  ) where

import Mdoc.Prelude

import Mdoc.Data.Argument
import Mdoc.Data.Config
import Mdoc.Data.Described
import Mdoc.Data.EnvVar
import Mdoc.Data.List (ByItem, Indent, List)
import Mdoc.Data.List qualified as List
import Mdoc.Data.Positional
import Mdoc.Data.Synopsis (Synopsis (..))
import Mdoc.Data.Synopsis qualified as Synopsis
import Mdoc.Optics
import Mdoc.Syntax

data Page = Page
  { synopsis :: Maybe Synopsis
  , prologue :: Maybe Mdoc
  , options :: Maybe (List Indent Positional)
  , configs :: Maybe (List Indent Config)
  , environment :: Maybe (List ByItem EnvVar)
  , epilogue :: Maybe Mdoc
  }
  deriving stock (Eq, Generic, Show)
  deriving anyclass (ToJSON)
  deriving (Monoid, Semigroup) via Generically Page

addSwitch :: Described Flag -> Page -> Page
addSwitch = addPositional . fmap PositionalSwitch

addOption :: Described Option -> Page -> Page
addOption = addPositional . fmap PositionalOption

addArgument :: Described Argument -> Page -> Page
addArgument = addPositional . fmap PositionalArgument

addPositional :: Described Positional -> Page -> Page
addPositional described m =
  m
    & field @"synopsis" <?>~ Synopsis.singleton described
    & field @"options" <?>~ List.singleton described

addConfig :: Described Config -> Page -> Page
addConfig described m =
  m & field @"configs" <?>~ List.singleton described

addEnvVar :: Described EnvVar -> Page -> Page
addEnvVar described m =
  m & field @"environment" <?>~ List.singleton described

setSynopsis :: Mdoc -> Page -> Page
setSynopsis s = field @"synopsis" ?~ SynopsisCustom s

setPrologue :: Mdoc -> Page -> Page
setPrologue p = field @"prologue" ?~ p

setEpilogue :: Mdoc -> Page -> Page
setEpilogue p = field @"epilogue" ?~ p