1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
use aws_sdk_eks as eks;
use clap::{Args, Subcommand};

use config::Config;
use error::RawsError;

mod addon;
mod cluster;
mod update;

type EksResult<T = Box<dyn show::Show>> = std::result::Result<T, eks::Error>;

/// Amazon Elastic Kubernetes Service (Amazon EKS)
#[derive(Debug, Subcommand)]
pub enum Eks {
    CreateCluster(cluster::CreateCluster),
    DeleteCluster(cluster::DeleteCluster),
    ListClusters(cluster::ListClusters),
    DescribeCluster(cluster::DescribeCluster),
    ListUpdates(update::ListUpdates),
    DescribeUpdate(update::DescribeUpdate),
    ListAddons(addon::ListAddons),
    DescribeAddon(addon::DescribeAddon),
}

impl Eks {
    async fn execute(self, config: &Config) -> EksResult {
        match self {
            Self::CreateCluster(create_cluster) => create_cluster.execute(config).await,
            Self::DeleteCluster(delete_cluster) => delete_cluster.execute(config).await,
            Self::ListClusters(list_cluster) => list_cluster.execute(config).await,
            Self::DescribeCluster(describe_cluster) => describe_cluster.execute(config).await,
            Self::ListUpdates(list_updates) => list_updates.execute(config).await,
            Self::DescribeUpdate(describe_update) => describe_update.execute(config).await,
            Self::ListAddons(list_addons) => list_addons.execute(config).await,
            Self::DescribeAddon(describe_addon) => describe_addon.execute(config).await,
        }
    }

    pub async fn dispatch(self, config: Config) -> Result<(), RawsError<eks::Error>> {
        self.execute(&config)
            .await
            .map(|output| config.show(output))?;
        Ok(())
    }
}