{-|
Module      : Headroom.Command.Gen.Env
Description : Environment for the Generate command
Copyright   : (c) 2019-2020 Vaclav Svejcar
License     : BSD-3
Maintainer  : vaclav.svejcar@gmail.com
Stability   : experimental
Portability : POSIX

Data types and instances for the /Generator/ command environment.
-}
{-# LANGUAGE NoImplicitPrelude #-}
module Headroom.Command.Gen.Env
  ( GenMode(..)
  , GenOptions(..)
  , Env(..)
  )
where

import           RIO


-- | Options for the /Generator/ command.
newtype GenOptions = GenOptions
  { GenOptions -> GenMode
goGenMode :: GenMode -- ^ used /Generator/ command mode
  }
  deriving Int -> GenOptions -> ShowS
[GenOptions] -> ShowS
GenOptions -> String
(Int -> GenOptions -> ShowS)
-> (GenOptions -> String)
-> ([GenOptions] -> ShowS)
-> Show GenOptions
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GenOptions] -> ShowS
$cshowList :: [GenOptions] -> ShowS
show :: GenOptions -> String
$cshow :: GenOptions -> String
showsPrec :: Int -> GenOptions -> ShowS
$cshowsPrec :: Int -> GenOptions -> ShowS
Show

-- | /RIO/ Environment for the /Generator/ command.
data Env = Env
  { Env -> LogFunc
envLogFunc    :: !LogFunc    -- ^ logging function
  , Env -> GenOptions
envGenOptions :: !GenOptions -- ^ options
  }

-- | Represents what action should the /Generator/ perform.
data GenMode
  = GenConfigFile   -- ^ generate /YAML/ config file stub
  | GenLicense Text -- ^ generate license header template
  deriving (GenMode -> GenMode -> Bool
(GenMode -> GenMode -> Bool)
-> (GenMode -> GenMode -> Bool) -> Eq GenMode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GenMode -> GenMode -> Bool
$c/= :: GenMode -> GenMode -> Bool
== :: GenMode -> GenMode -> Bool
$c== :: GenMode -> GenMode -> Bool
Eq, Int -> GenMode -> ShowS
[GenMode] -> ShowS
GenMode -> String
(Int -> GenMode -> ShowS)
-> (GenMode -> String) -> ([GenMode] -> ShowS) -> Show GenMode
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GenMode] -> ShowS
$cshowList :: [GenMode] -> ShowS
show :: GenMode -> String
$cshow :: GenMode -> String
showsPrec :: Int -> GenMode -> ShowS
$cshowsPrec :: Int -> GenMode -> ShowS
Show)

instance HasLogFunc Env where
  logFuncL :: (LogFunc -> f LogFunc) -> Env -> f Env
logFuncL = (Env -> LogFunc) -> (Env -> LogFunc -> Env) -> Lens' Env LogFunc
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens Env -> LogFunc
envLogFunc (\x :: Env
x y :: LogFunc
y -> Env
x { envLogFunc :: LogFunc
envLogFunc = LogFunc
y })