packages feed

ronn-opt-env-conf-1.0.1.1: src/Ronn/OptEnvConf/Env.hs

-- |
--
-- Module      : Ronn.OptEnvConf.Env
-- Copyright   : (c) 2024 Patrick Brisbin
-- License     : AGPL-3
-- Maintainer  : pbrisbin@gmail.com
-- Stability   : experimental
-- Portability : POSIX
module Ronn.OptEnvConf.Env
  ( envDefinitions
  ) where

import Prelude

import Data.Foldable (toList)
import Data.List (intersperse)
import Data.String (IsString (..))
import OptEnvConf (Parser)
import OptEnvConf.Doc (AnyDocs (..), EnvDoc (..), parserEnvDocs)
import Ronn.AST

envDefinitions :: Parser a -> [Definition]
envDefinitions = go . parserEnvDocs
 where
  go :: AnyDocs EnvDoc -> [Definition]
  go = \case
    AnyDocsCommands {} -> [] -- TODO
    AnyDocsAnd ds -> concatMap go ds
    AnyDocsOr ds -> concatMap go ds
    AnyDocsSingle d -> [envDocDefinition d]

envDocDefinition :: EnvDoc -> Definition
envDocDefinition doc =
  Definition
    { name
    , description = maybe [] (pure . fromString) $ envDocHelp doc
    , content = Nothing
    }
 where
  name =
    Concat
      $ addArgument
      $ intersperse "|"
      $ map (Code . fromString)
      $ toList
      $ envDocVars doc

  addArgument = case envDocMetavar doc of
    Nothing -> id
    Just arg -> (<> ["=", Variable $ fromString arg])