module Options.Harg.Pretty
  ( ppHelp,
    ppSourceRunErrors,
  )
where

import Control.Applicative ((<|>))
import Data.List (intercalate)
import Data.Maybe (fromMaybe)
import Options.Harg.Sources.Types
import Options.Harg.Types

ppHelp ::
  Opt a ->
  Maybe String
ppHelp :: Opt a -> Maybe String
ppHelp Opt {..} =
  (String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Maybe String -> String
ppEnvVar Maybe String
_optEnvVar) (String -> String) -> Maybe String -> Maybe String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe String
_optHelp

ppSourceRunErrors ::
  [SourceRunError] ->
  String
ppSourceRunErrors :: [SourceRunError] -> String
ppSourceRunErrors =
  String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate "\n\n"
    ([String] -> String)
-> ([SourceRunError] -> [String]) -> [SourceRunError] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (SourceRunError -> String) -> [SourceRunError] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map SourceRunError -> String
ppSourceRunError
  where
    ppSourceRunError :: SourceRunError -> String
    ppSourceRunError :: SourceRunError -> String
ppSourceRunError (SourceRunError Nothing src :: String
src desc :: String
desc) =
      "error: "
        String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
desc
        String -> String -> String
forall a. Semigroup a => a -> a -> a
<> "\n\t"
        String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String -> String
ppSource String
src
    ppSourceRunError (SourceRunError (Just (SomeOpt opt :: Opt a
opt)) src :: String
src desc :: String
desc) =
      "option "
        String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Opt a -> String
forall a. Opt a -> String
optId Opt a
opt
        String -> String -> String
forall a. Semigroup a => a -> a -> a
<> ": "
        String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
desc
        String -> String -> String
forall a. Semigroup a => a -> a -> a
<> "\n\t"
        String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String -> String
ppSource String
src
        String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Maybe String -> String
ppEnvVar (Opt a -> Maybe String
forall a. Opt a -> Maybe String
_optEnvVar Opt a
opt)

    optId :: Opt a -> String
optId Opt {..} =
      String -> Maybe String -> String
forall a. a -> Maybe a -> a
fromMaybe "<no name available>" (Maybe String -> String) -> Maybe String -> String
forall a b. (a -> b) -> a -> b
$
        Maybe String
_optLong Maybe String -> Maybe String -> Maybe String
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (Char -> String
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Char -> String) -> Maybe Char -> Maybe String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Char
_optShort) Maybe String -> Maybe String -> Maybe String
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Maybe String
_optMetavar

ppSource ::
  String ->
  String
ppSource :: String -> String
ppSource s :: String
s =
  " (source: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
s String -> String -> String
forall a. Semigroup a => a -> a -> a
<> ")"

ppEnvVar ::
  Maybe String ->
  String
ppEnvVar :: Maybe String -> String
ppEnvVar =
  String -> (String -> String) -> Maybe String -> String
forall b a. b -> (a -> b) -> Maybe a -> b
maybe "" ((String -> String) -> Maybe String -> String)
-> (String -> String) -> Maybe String -> String
forall a b. (a -> b) -> a -> b
$ \s :: String
s -> " (env var: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
s String -> String -> String
forall a. Semigroup a => a -> a -> a
<> ")"