packages feed

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

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

import Mdoc.Prelude

import Data.Aeson (object, (.=))
import Data.Text qualified as T
import Mdoc.Data.Page
import Mdoc.Optics

data Named = Named
  { names :: NonEmpty Text
  , description :: Text
  , page :: Page
  }
  deriving stock (Eq, Generic, Show)

instance ToJSON Named where
  toJSON named =
    object
      [ "title" .= T.toUpper (esc $ head named.names)
      , "name"
          .= object
            [ "init" .= map esc (init named.names)
            , "last" .= esc (last named.names)
            , "description" .= esc named.description
            ]
      , "page" .= named.page
      ]

name :: Text -> Text -> Page -> Named
name primary description page =
  Named {names = pure primary, description, page}

addSecondary :: Text -> Named -> Named
addSecondary x = field @"names" <>~ pure x