packages feed

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

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

import Mdoc.Prelude

import Mdoc.Pretty

data Config = Config
  { name :: Maybe String
  , schema :: Schema
  }
  deriving stock (Eq, Ord, Show)
  deriving (ToJSON) via (Rendered Config)

instance Pretty Config where
  pretty c = maybe id prefix c.name $ ":" <+> pretty c.schema
   where
    prefix :: String -> Doc ann -> Doc ann
    prefix n x = "Cm" <+> pretty (esc $ pack n) <+> x

data Schema
  = Simple Text
  | AnyOf [Schema]
  | ListOf Schema
  deriving stock (Eq, Ord, Show)

instance IsString Schema where
  fromString = Simple . pack

instance Pretty Schema where
  pretty = \case
    Simple t -> "Ar" <+> pretty (esc t)
    AnyOf ss -> mconcat $ punctuate " Ns | Ns " $ map pretty ss
    ListOf s@(AnyOf {}) -> "(" <+> pretty s <+> ") Ns []"
    ListOf s -> pretty s <+> "Ns []"