module PlutusCore.Executable.Help
( Example (..)
, eg
, examplesDoc
, examplesFooter
) where
import Options.Applicative (InfoMod, footerDoc)
import Options.Applicative.Help.Pretty (Doc, concatWith, hardline, pretty)
data Example = Example
{ Example -> String
exampleDescription :: String
, Example -> String
exampleCommand :: String
}
deriving stock (Example -> Example -> Bool
(Example -> Example -> Bool)
-> (Example -> Example -> Bool) -> Eq Example
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Example -> Example -> Bool
== :: Example -> Example -> Bool
$c/= :: Example -> Example -> Bool
/= :: Example -> Example -> Bool
Eq, Int -> Example -> ShowS
[Example] -> ShowS
Example -> String
(Int -> Example -> ShowS)
-> (Example -> String) -> ([Example] -> ShowS) -> Show Example
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Example -> ShowS
showsPrec :: Int -> Example -> ShowS
$cshow :: Example -> String
show :: Example -> String
$cshowList :: [Example] -> ShowS
showList :: [Example] -> ShowS
Show)
eg :: String -> String -> Example
eg :: String -> String -> Example
eg = String -> String -> Example
Example
examplesDoc :: [Example] -> Maybe Doc
examplesDoc :: [Example] -> Maybe Doc
examplesDoc [] = Maybe Doc
forall a. Maybe a
Nothing
examplesDoc [Example]
examples = Doc -> Maybe Doc
forall a. a -> Maybe a
Just ([Doc] -> Doc
forall {ann}. [Doc ann] -> Doc ann
joinLines (String -> Doc
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"Examples:" Doc -> [Doc] -> [Doc]
forall a. a -> [a] -> [a]
: (Example -> [Doc]) -> [Example] -> [Doc]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap Example -> [Doc]
forall {ann}. Example -> [Doc ann]
render [Example]
examples))
where
render :: Example -> [Doc ann]
render (Example String
desc String
cmd) =
[ Doc ann
forall a. Monoid a => a
mempty
, String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (String
" # " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
desc)
, String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (String
" " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
cmd)
]
joinLines :: [Doc ann] -> Doc ann
joinLines = (Doc ann -> Doc ann -> Doc ann) -> [Doc ann] -> Doc ann
forall (t :: * -> *) ann.
Foldable t =>
(Doc ann -> Doc ann -> Doc ann) -> t (Doc ann) -> Doc ann
concatWith (\Doc ann
x Doc ann
y -> Doc ann
x Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
forall ann. Doc ann
hardline Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
y)
examplesFooter :: [Example] -> InfoMod a
= Maybe Doc -> InfoMod a
forall a. Maybe Doc -> InfoMod a
footerDoc (Maybe Doc -> InfoMod a)
-> ([Example] -> Maybe Doc) -> [Example] -> InfoMod a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Example] -> Maybe Doc
examplesDoc