module Cloudy.Cli.Aws where

import Options.Applicative (Parser, command, info, progDesc, hsubparser)

data AwsCliOpts
  = AwsCreate AwsCreateCliOpts
  | AwsListInstanceTypes AwsListInstanceTypesCliOpts
  deriving stock Int -> AwsCliOpts -> ShowS
[AwsCliOpts] -> ShowS
AwsCliOpts -> String
(Int -> AwsCliOpts -> ShowS)
-> (AwsCliOpts -> String)
-> ([AwsCliOpts] -> ShowS)
-> Show AwsCliOpts
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> AwsCliOpts -> ShowS
showsPrec :: Int -> AwsCliOpts -> ShowS
$cshow :: AwsCliOpts -> String
show :: AwsCliOpts -> String
$cshowList :: [AwsCliOpts] -> ShowS
showList :: [AwsCliOpts] -> ShowS
Show

data AwsCreateCliOpts = AwsCreateCliOpts
  deriving stock Int -> AwsCreateCliOpts -> ShowS
[AwsCreateCliOpts] -> ShowS
AwsCreateCliOpts -> String
(Int -> AwsCreateCliOpts -> ShowS)
-> (AwsCreateCliOpts -> String)
-> ([AwsCreateCliOpts] -> ShowS)
-> Show AwsCreateCliOpts
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> AwsCreateCliOpts -> ShowS
showsPrec :: Int -> AwsCreateCliOpts -> ShowS
$cshow :: AwsCreateCliOpts -> String
show :: AwsCreateCliOpts -> String
$cshowList :: [AwsCreateCliOpts] -> ShowS
showList :: [AwsCreateCliOpts] -> ShowS
Show

data AwsListInstanceTypesCliOpts = AwsListInstanceTypesCliOpts
  deriving stock Int -> AwsListInstanceTypesCliOpts -> ShowS
[AwsListInstanceTypesCliOpts] -> ShowS
AwsListInstanceTypesCliOpts -> String
(Int -> AwsListInstanceTypesCliOpts -> ShowS)
-> (AwsListInstanceTypesCliOpts -> String)
-> ([AwsListInstanceTypesCliOpts] -> ShowS)
-> Show AwsListInstanceTypesCliOpts
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> AwsListInstanceTypesCliOpts -> ShowS
showsPrec :: Int -> AwsListInstanceTypesCliOpts -> ShowS
$cshow :: AwsListInstanceTypesCliOpts -> String
show :: AwsListInstanceTypesCliOpts -> String
$cshowList :: [AwsListInstanceTypesCliOpts] -> ShowS
showList :: [AwsListInstanceTypesCliOpts] -> ShowS
Show

awsCliOptsParser :: Parser AwsCliOpts
awsCliOptsParser :: Parser AwsCliOpts
awsCliOptsParser = Mod CommandFields AwsCliOpts -> Parser AwsCliOpts
forall a. Mod CommandFields a -> Parser a
hsubparser Mod CommandFields AwsCliOpts
subParsers
  where
    subParsers :: Mod CommandFields AwsCliOpts
subParsers = Mod CommandFields AwsCliOpts
createCommand Mod CommandFields AwsCliOpts
-> Mod CommandFields AwsCliOpts -> Mod CommandFields AwsCliOpts
forall a. Semigroup a => a -> a -> a
<> Mod CommandFields AwsCliOpts
listInstanceTypesCommand

    createCommand :: Mod CommandFields AwsCliOpts
createCommand =
      String -> ParserInfo AwsCliOpts -> Mod CommandFields AwsCliOpts
forall a. String -> ParserInfo a -> Mod CommandFields a
command
        String
"create"
        ( Parser AwsCliOpts -> InfoMod AwsCliOpts -> ParserInfo AwsCliOpts
forall a. Parser a -> InfoMod a -> ParserInfo a
info
            ((AwsCreateCliOpts -> AwsCliOpts)
-> Parser AwsCreateCliOpts -> Parser AwsCliOpts
forall a b. (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap AwsCreateCliOpts -> AwsCliOpts
AwsCreate Parser AwsCreateCliOpts
awsCreateCliOptsParser)
            (String -> InfoMod AwsCliOpts
forall a. String -> InfoMod a
progDesc String
"Create a new compute instance in AWS")
        )

    listInstanceTypesCommand :: Mod CommandFields AwsCliOpts
listInstanceTypesCommand =
      String -> ParserInfo AwsCliOpts -> Mod CommandFields AwsCliOpts
forall a. String -> ParserInfo a -> Mod CommandFields a
command
        String
"list-instance-types"
        ( Parser AwsCliOpts -> InfoMod AwsCliOpts -> ParserInfo AwsCliOpts
forall a. Parser a -> InfoMod a -> ParserInfo a
info
            ((AwsListInstanceTypesCliOpts -> AwsCliOpts)
-> Parser AwsListInstanceTypesCliOpts -> Parser AwsCliOpts
forall a b. (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap AwsListInstanceTypesCliOpts -> AwsCliOpts
AwsListInstanceTypes Parser AwsListInstanceTypesCliOpts
awsListInstanceTypesCliOptsParser)
            (String -> InfoMod AwsCliOpts
forall a. String -> InfoMod a
progDesc String
"List all instance types in AWS")
        )

awsCreateCliOptsParser :: Parser AwsCreateCliOpts
awsCreateCliOptsParser :: Parser AwsCreateCliOpts
awsCreateCliOptsParser = AwsCreateCliOpts -> Parser AwsCreateCliOpts
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure AwsCreateCliOpts
AwsCreateCliOpts

awsListInstanceTypesCliOptsParser :: Parser AwsListInstanceTypesCliOpts
awsListInstanceTypesCliOptsParser :: Parser AwsListInstanceTypesCliOpts
awsListInstanceTypesCliOptsParser = AwsListInstanceTypesCliOpts -> Parser AwsListInstanceTypesCliOpts
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure AwsListInstanceTypesCliOpts
AwsListInstanceTypesCliOpts