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

import Prelude

import Data.List (intersperse)
import Data.Maybe (fromMaybe)
import Data.String (IsString (..))
import Ronn.AST
import Ronn.Argument

data Env = Env
  { Env -> [String]
vars :: [String]
  , Env -> Maybe String
argument :: Maybe String
  , Env -> Maybe String
default_ :: Maybe String
  , Env -> Maybe RonnLine
help :: Maybe RonnLine
  }

instance HasArgument Env where
  getArgument :: Env -> Maybe String
getArgument = (.argument)

envToDefinition :: Env -> RonnDefinition
envToDefinition :: Env -> RonnDefinition
envToDefinition Env
env =
  RonnDefinition
    { $sel:name:RonnDefinition :: RonnPart
name =
        Text -> Env -> RonnPart -> RonnPart
forall a. HasArgument a => Text -> a -> RonnPart -> RonnPart
addArgument Text
"=" Env
env (RonnPart -> RonnPart) -> RonnPart -> RonnPart
forall a b. (a -> b) -> a -> b
$
          [RonnPart] -> RonnPart
RonnConcat ([RonnPart] -> RonnPart) -> [RonnPart] -> RonnPart
forall a b. (a -> b) -> a -> b
$
            RonnPart -> [RonnPart] -> [RonnPart]
forall a. a -> [a] -> [a]
intersperse RonnPart
"|" ([RonnPart] -> [RonnPart]) -> [RonnPart] -> [RonnPart]
forall a b. (a -> b) -> a -> b
$
              (String -> RonnPart) -> [String] -> [RonnPart]
forall a b. (a -> b) -> [a] -> [b]
map (RonnPart -> RonnPart
RonnCode (RonnPart -> RonnPart)
-> (String -> RonnPart) -> String -> RonnPart
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> RonnPart
forall a. IsString a => String -> a
fromString) Env
env.vars
    , $sel:description:RonnDefinition :: RonnLine
description = RonnLine -> Maybe RonnLine -> RonnLine
forall a. a -> Maybe a -> a
fromMaybe ([RonnPart] -> RonnLine
RonnLine []) Env
env.help
    , $sel:content:RonnDefinition :: Maybe [RonnContent]
content = Maybe [RonnContent]
forall a. Maybe a
Nothing
    }

environmentSection :: [Env] -> RonnSection
environmentSection :: [Env] -> RonnSection
environmentSection [Env]
envs =
  RonnSection
    { $sel:name:RonnSection :: Text
name = Text
"ENVIRONMENT"
    , $sel:content:RonnSection :: [RonnContent]
content = [[RonnDefinition] -> RonnContent
RonnDefinitions ([RonnDefinition] -> RonnContent)
-> [RonnDefinition] -> RonnContent
forall a b. (a -> b) -> a -> b
$ (Env -> RonnDefinition) -> [Env] -> [RonnDefinition]
forall a b. (a -> b) -> [a] -> [b]
map Env -> RonnDefinition
envToDefinition [Env]
envs]
    }