module Data.Registry.Options.OptionDescription where
import Data.Registry.Options.Text
import Data.Text qualified as T
import Protolude as P
data OptionDescription = OptionDescription
{ OptionDescription -> Maybe Text
_name :: Maybe Text,
OptionDescription -> [Text]
_aliases :: [Text],
OptionDescription -> Maybe Char
_shortName :: Maybe Char,
OptionDescription -> Maybe Text
_metavar :: Maybe Text,
OptionDescription -> Maybe Text
_help :: Maybe Text
}
deriving (OptionDescription -> OptionDescription -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: OptionDescription -> OptionDescription -> Bool
$c/= :: OptionDescription -> OptionDescription -> Bool
== :: OptionDescription -> OptionDescription -> Bool
$c== :: OptionDescription -> OptionDescription -> Bool
Eq, Int -> OptionDescription -> ShowS
[OptionDescription] -> ShowS
OptionDescription -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [OptionDescription] -> ShowS
$cshowList :: [OptionDescription] -> ShowS
show :: OptionDescription -> String
$cshow :: OptionDescription -> String
showsPrec :: Int -> OptionDescription -> ShowS
$cshowsPrec :: Int -> OptionDescription -> ShowS
Show)
instance Semigroup OptionDescription where
OptionDescription Maybe Text
n1 [Text]
as1 Maybe Char
s1 Maybe Text
m1 Maybe Text
h1 <> :: OptionDescription -> OptionDescription -> OptionDescription
<> OptionDescription Maybe Text
n2 [Text]
as2 Maybe Char
s2 Maybe Text
m2 Maybe Text
h2 =
Maybe Text
-> [Text]
-> Maybe Char
-> Maybe Text
-> Maybe Text
-> OptionDescription
OptionDescription (Maybe Text
n2 forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Maybe Text
n1) ([Text]
as1 forall a. Semigroup a => a -> a -> a
<> [Text]
as2) (Maybe Char
s2 forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Maybe Char
s1) (Maybe Text
m2 forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Maybe Text
m1) (Maybe Text
h2 forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Maybe Text
h1)
instance Monoid OptionDescription where
mempty :: OptionDescription
mempty = Maybe Text
-> [Text]
-> Maybe Char
-> Maybe Text
-> Maybe Text
-> OptionDescription
OptionDescription forall a. Maybe a
Nothing forall a. Monoid a => a
mempty forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing
mappend :: OptionDescription -> OptionDescription -> OptionDescription
mappend = forall a. Semigroup a => a -> a -> a
(<>)
type OptionDescriptionUpdate = OptionDescription -> OptionDescription
type OptionDescriptionUpdates = [OptionDescriptionUpdate]
makeOptionDescription :: OptionDescriptionUpdates -> OptionDescription
makeOptionDescription :: OptionDescriptionUpdates -> OptionDescription
makeOptionDescription = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl (\OptionDescription
r OptionDescription -> OptionDescription
u -> OptionDescription -> OptionDescription
u OptionDescription
r) forall a. Monoid a => a
mempty
name :: Text -> OptionDescriptionUpdate
name :: Text -> OptionDescription -> OptionDescription
name Text
t OptionDescription
o = OptionDescription
o {_name :: Maybe Text
_name = forall a. a -> Maybe a
Just Text
t}
alias :: Text -> OptionDescriptionUpdate
alias :: Text -> OptionDescription -> OptionDescription
alias Text
t OptionDescription
o = OptionDescription
o {_aliases :: [Text]
_aliases = [Text
t]}
short :: Char -> OptionDescriptionUpdate
short :: Char -> OptionDescription -> OptionDescription
short Char
t OptionDescription
o = OptionDescription
o {_shortName :: Maybe Char
_shortName = forall a. a -> Maybe a
Just Char
t}
noShort :: OptionDescriptionUpdate
noShort :: OptionDescription -> OptionDescription
noShort OptionDescription
o = OptionDescription
o {_shortName :: Maybe Char
_shortName = forall a. Maybe a
Nothing}
metavar :: Text -> OptionDescriptionUpdate
metavar :: Text -> OptionDescription -> OptionDescription
metavar Text
t OptionDescription
o = OptionDescription
o {_metavar :: Maybe Text
_metavar = forall a. a -> Maybe a
Just Text
t}
help :: Text -> OptionDescriptionUpdate
help :: Text -> OptionDescription -> OptionDescription
help Text
t OptionDescription
o = OptionDescription
o {_help :: Maybe Text
_help = forall a. a -> Maybe a
Just Text
t}
displayCliOptionName :: OptionDescription -> Text
displayCliOptionName :: OptionDescription -> Text
displayCliOptionName OptionDescription
o =
case OptionDescription -> [Text]
getNames OptionDescription
o of
Text
n : [Text]
_ -> Text -> Text
camelCaseToHyphenated Text
n
[] -> forall a. a -> Maybe a -> a
fromMaybe Text
"<empty>" (OptionDescription -> Maybe Text
_metavar OptionDescription
o)
getNames :: OptionDescription -> [Text]
getNames :: OptionDescription -> [Text]
getNames OptionDescription
o = forall a. [Maybe a] -> [a]
catMaybes [OptionDescription -> Maybe Text
_name OptionDescription
o, Char -> Text
T.singleton forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> OptionDescription -> Maybe Char
_shortName OptionDescription
o] forall a. Semigroup a => a -> a -> a
<> OptionDescription -> [Text]
_aliases OptionDescription
o