{-# LANGUAGE OverloadedStrings #-}

module OptEnvConf.Output where

import Data.List (intercalate, intersperse)
import Data.List.NonEmpty (NonEmpty (..))
import qualified Data.List.NonEmpty as NE
import Data.Maybe
import Data.Text (Text)
import qualified Data.Text as T
import Data.Version
import GHC.Stack (SrcLoc, prettySrcLoc)
import OptEnvConf.Args (Dashed (..))
import qualified OptEnvConf.Args as Args
import OptEnvConf.Parser
import Text.Colour

stringLines :: String -> [[Chunk]]
stringLines :: [Char] -> [[Chunk]]
stringLines [Char]
s =
  let ls :: [Text]
ls = Text -> [Text]
T.lines ([Char] -> Text
T.pack [Char]
s)
   in (Text -> [Chunk]) -> [Text] -> [[Chunk]]
forall a b. (a -> b) -> [a] -> [b]
map (Chunk -> [Chunk]
forall a. a -> [a]
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Chunk -> [Chunk]) -> (Text -> Chunk) -> Text -> [Chunk]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Chunk
chunk) [Text]
ls

progNameChunk :: String -> Chunk
progNameChunk :: [Char] -> Chunk
progNameChunk = Colour -> Chunk -> Chunk
fore Colour
yellow (Chunk -> Chunk) -> ([Char] -> Chunk) -> [Char] -> Chunk
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Chunk
chunk (Text -> Chunk) -> ([Char] -> Text) -> [Char] -> Chunk
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> Text
T.pack

versionChunk :: Version -> Chunk
versionChunk :: Version -> Chunk
versionChunk = Text -> Chunk
chunk (Text -> Chunk) -> (Version -> Text) -> Version -> Chunk
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> Text
T.pack ([Char] -> Text) -> (Version -> [Char]) -> Version -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Version -> [Char]
showVersion

usageChunk :: Chunk
usageChunk :: Chunk
usageChunk = Colour -> Chunk -> Chunk
fore Colour
cyan Chunk
"Usage: "

commandChunk :: String -> Chunk
commandChunk :: [Char] -> Chunk
commandChunk = Colour -> Chunk -> Chunk
fore Colour
magenta (Chunk -> Chunk) -> ([Char] -> Chunk) -> [Char] -> Chunk
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Chunk
chunk (Text -> Chunk) -> ([Char] -> Text) -> [Char] -> Chunk
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> Text
T.pack

mMetavarChunk :: Maybe Metavar -> Chunk
mMetavarChunk :: Maybe [Char] -> Chunk
mMetavarChunk = [Char] -> Chunk
metavarChunk ([Char] -> Chunk)
-> (Maybe [Char] -> [Char]) -> Maybe [Char] -> Chunk
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> Maybe [Char] -> [Char]
forall a. a -> Maybe a -> a
fromMaybe [Char]
"METAVAR"

metavarChunk :: Metavar -> Chunk
metavarChunk :: [Char] -> Chunk
metavarChunk = Colour -> Chunk -> Chunk
fore Colour
yellow (Chunk -> Chunk) -> ([Char] -> Chunk) -> [Char] -> Chunk
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Chunk
chunk (Text -> Chunk) -> ([Char] -> Text) -> [Char] -> Chunk
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> Text
T.pack

dashedChunks :: [Dashed] -> Maybe [Chunk]
dashedChunks :: [Dashed] -> Maybe [Chunk]
dashedChunks = (NonEmpty Dashed -> [Chunk])
-> Maybe (NonEmpty Dashed) -> Maybe [Chunk]
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap NonEmpty Dashed -> [Chunk]
dashedChunksNE (Maybe (NonEmpty Dashed) -> Maybe [Chunk])
-> ([Dashed] -> Maybe (NonEmpty Dashed))
-> [Dashed]
-> Maybe [Chunk]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Dashed] -> Maybe (NonEmpty Dashed)
forall a. [a] -> Maybe (NonEmpty a)
NE.nonEmpty

dashedChunksNE :: NonEmpty Dashed -> [Chunk]
dashedChunksNE :: NonEmpty Dashed -> [Chunk]
dashedChunksNE = Chunk -> [Chunk] -> [Chunk]
forall a. a -> [a] -> [a]
intersperse (Colour -> Chunk -> Chunk
fore Colour
cyan Chunk
"|") ([Chunk] -> [Chunk])
-> (NonEmpty Dashed -> [Chunk]) -> NonEmpty Dashed -> [Chunk]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Dashed -> Chunk) -> [Dashed] -> [Chunk]
forall a b. (a -> b) -> [a] -> [b]
map Dashed -> Chunk
dashedChunk ([Dashed] -> [Chunk])
-> (NonEmpty Dashed -> [Dashed]) -> NonEmpty Dashed -> [Chunk]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmpty Dashed -> [Dashed]
forall a. NonEmpty a -> [a]
NE.toList

dashedChunk :: Dashed -> Chunk
dashedChunk :: Dashed -> Chunk
dashedChunk = Colour -> Chunk -> Chunk
fore Colour
white (Chunk -> Chunk) -> (Dashed -> Chunk) -> Dashed -> Chunk
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Chunk
chunk (Text -> Chunk) -> (Dashed -> Text) -> Dashed -> Chunk
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> Text
T.pack ([Char] -> Text) -> (Dashed -> [Char]) -> Dashed -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Dashed -> [Char]
Args.renderDashed

envVarChunksNE :: NonEmpty String -> [Chunk]
envVarChunksNE :: NonEmpty [Char] -> [Chunk]
envVarChunksNE = Chunk -> [Chunk] -> [Chunk]
forall a. a -> [a] -> [a]
intersperse (Colour -> Chunk -> Chunk
fore Colour
cyan Chunk
"|") ([Chunk] -> [Chunk])
-> (NonEmpty [Char] -> [Chunk]) -> NonEmpty [Char] -> [Chunk]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Char] -> Chunk) -> [[Char]] -> [Chunk]
forall a b. (a -> b) -> [a] -> [b]
map [Char] -> Chunk
envVarChunk ([[Char]] -> [Chunk])
-> (NonEmpty [Char] -> [[Char]]) -> NonEmpty [Char] -> [Chunk]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmpty [Char] -> [[Char]]
forall a. NonEmpty a -> [a]
NE.toList

envVarChunk :: String -> Chunk
envVarChunk :: [Char] -> Chunk
envVarChunk = Colour -> Chunk -> Chunk
fore Colour
white (Chunk -> Chunk) -> ([Char] -> Chunk) -> [Char] -> Chunk
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Chunk
chunk (Text -> Chunk) -> ([Char] -> Text) -> [Char] -> Chunk
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> Text
T.pack

confValChunk :: NonEmpty String -> Chunk
confValChunk :: NonEmpty [Char] -> Chunk
confValChunk = Colour -> Chunk -> Chunk
fore Colour
white (Chunk -> Chunk)
-> (NonEmpty [Char] -> Chunk) -> NonEmpty [Char] -> Chunk
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Chunk
chunk (Text -> Chunk)
-> (NonEmpty [Char] -> Text) -> NonEmpty [Char] -> Chunk
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> Text
T.pack ([Char] -> Text)
-> (NonEmpty [Char] -> [Char]) -> NonEmpty [Char] -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> [[Char]] -> [Char]
forall a. [a] -> [[a]] -> [a]
intercalate [Char]
"." ([[Char]] -> [Char])
-> (NonEmpty [Char] -> [[Char]]) -> NonEmpty [Char] -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmpty [Char] -> [[Char]]
forall a. NonEmpty a -> [a]
NE.toList

defaultValueChunks :: String -> [Chunk]
defaultValueChunks :: [Char] -> [Chunk]
defaultValueChunks [Char]
val = [Chunk
"default: ", Colour -> Chunk -> Chunk
fore Colour
yellow (Chunk -> Chunk) -> Chunk -> Chunk
forall a b. (a -> b) -> a -> b
$ Text -> Chunk
chunk (Text -> Chunk) -> Text -> Chunk
forall a b. (a -> b) -> a -> b
$ [Char] -> Text
T.pack [Char]
val]

mHelpChunk :: Maybe Help -> Chunk
mHelpChunk :: Maybe [Char] -> Chunk
mHelpChunk = Chunk -> ([Char] -> Chunk) -> Maybe [Char] -> Chunk
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Colour -> Chunk -> Chunk
fore Colour
red Chunk
"undocumented") [Char] -> Chunk
helpChunk

helpChunk :: Help -> Chunk
helpChunk :: [Char] -> Chunk
helpChunk = Colour -> Chunk -> Chunk
fore Colour
blue (Chunk -> Chunk) -> ([Char] -> Chunk) -> [Char] -> Chunk
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Chunk
chunk (Text -> Chunk) -> ([Char] -> Text) -> [Char] -> Chunk
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> Text
T.pack

headerChunks :: Text -> [Chunk]
headerChunks :: Text -> [Chunk]
headerChunks Text
t = [Colour -> Chunk -> Chunk
fore Colour
cyan (Text -> Chunk
chunk Text
t), Chunk
":"]

syntaxChunk :: String -> Chunk
syntaxChunk :: [Char] -> Chunk
syntaxChunk = Colour -> Chunk -> Chunk
fore Colour
blue (Chunk -> Chunk) -> ([Char] -> Chunk) -> [Char] -> Chunk
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Chunk
chunk (Text -> Chunk) -> ([Char] -> Text) -> [Char] -> Chunk
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> Text
T.pack

mSrcLocChunk :: Maybe SrcLoc -> Chunk
mSrcLocChunk :: Maybe SrcLoc -> Chunk
mSrcLocChunk = Chunk -> (SrcLoc -> Chunk) -> Maybe SrcLoc -> Chunk
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Chunk
"without srcLoc" SrcLoc -> Chunk
srcLocChunk

srcLocChunk :: SrcLoc -> Chunk
srcLocChunk :: SrcLoc -> Chunk
srcLocChunk = Colour -> Chunk -> Chunk
fore Colour
cyan (Chunk -> Chunk) -> (SrcLoc -> Chunk) -> SrcLoc -> Chunk
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Chunk
chunk (Text -> Chunk) -> (SrcLoc -> Text) -> SrcLoc -> Chunk
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> Text
T.pack ([Char] -> Text) -> (SrcLoc -> [Char]) -> SrcLoc -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SrcLoc -> [Char]
prettySrcLoc

indent :: [[Chunk]] -> [[Chunk]]
indent :: [[Chunk]] -> [[Chunk]]
indent = ([Chunk] -> [Chunk]) -> [[Chunk]] -> [[Chunk]]
forall a b. (a -> b) -> [a] -> [b]
map (Chunk
"  " Chunk -> [Chunk] -> [Chunk]
forall a. a -> [a] -> [a]
:)