use super::*;
use rkubectl_ui::Created;
use clusterrole::CreateClusterRole;
use namespace::CreateNamespace;
use secret::CreateSecret;
mod clusterrole;
mod namespace;
mod secret;
#[derive(Clone, Debug, Args)]
#[command(arg_required_else_help(true), subcommand_negates_reqs(true))]
pub struct Create {
#[arg(
long,
value_enum,
default_value_t = DryRun::None,
// value_parser = PossibleValuesParser::new(["none", "server", "client"]),
)]
dry_run: DryRun,
#[arg(long)]
edit: bool,
#[arg(long, default_value = "kubectl-create")]
field_manager: String,
#[arg(short, long, required = true)]
filename: Option<String>,
#[arg(long, short = 'R', requires = "filename")]
recursive: bool,
#[arg(long)]
save_config: bool,
#[arg(long)]
show_managed_fields: bool,
#[command(subcommand)]
command: Option<CreateResource>,
}
#[derive(Clone, Debug, Subcommand)]
#[command(rename_all = "lowercase")]
pub enum CreateResource {
ClusterRole(CreateClusterRole),
ClusterRoleBinding,
ConfigMap,
CronJob,
Deployment,
Ingress,
Job,
#[command(visible_alias = "ns")]
Namespace(CreateNamespace),
PodDisruptionBudget,
PriorityClass,
Quota,
Role,
RoleBinding,
#[command(subcommand)]
Secret(CreateSecret),
Service,
ServiceAccount,
Token,
}
impl Create {
pub async fn exec(self, context: &Context) -> RkResult<()> {
let kubeapi = context.kubeapi();
let created = if let Some(filename) = &self.filename {
self.create_from_file(filename, kubeapi).await
} else {
self.create_resource(kubeapi).await
}?;
let namespace = kubeapi.show_namespace();
let params = self.params();
let output = context.output_deprecated();
println!("{}", created.output(namespace, params, output));
Ok(())
}
async fn create_from_file(&self, filename: &str, kubeapi: &Kubeapi) -> RkResult<Box<dyn Show>> {
let pp = kubeapi.post_params_with_manager(&self.field_manager);
println!("Creating from {filename} [{pp:?}]");
Err(RkError::todo())
}
async fn create_resource(&self, kubeapi: &Kubeapi) -> RkResult<Box<dyn Show>> {
if let Some(command) = &self.command {
let pp = kubeapi.post_params_with_manager(&self.field_manager);
command.exec(kubeapi, &pp).await
} else {
unreachable!()
}
}
fn params(&self) -> ShowParams {
ShowParams {
show_managed_fields: self.show_managed_fields,
..default()
}
}
}
impl CreateResource {
pub async fn exec(&self, kubeapi: &Kubeapi, pp: &api::PostParams) -> RkResult<Box<dyn Show>> {
match self {
Self::ClusterRole(cluster_role) => cluster_role.exec(kubeapi, pp).await,
Self::ClusterRoleBinding => Err(RkError::todo()),
Self::ConfigMap => Err(RkError::todo()),
Self::CronJob => Err(RkError::todo()),
Self::Deployment => Err(RkError::todo()),
Self::Ingress => Err(RkError::todo()),
Self::Job => Err(RkError::todo()),
Self::Namespace(namespace) => namespace.exec(kubeapi, pp).await,
Self::PodDisruptionBudget => Err(RkError::todo()),
Self::PriorityClass => Err(RkError::todo()),
Self::Quota => Err(RkError::todo()),
Self::Role => Err(RkError::todo()),
Self::RoleBinding => Err(RkError::todo()),
Self::Secret(secret) => secret.exec(kubeapi, pp).await,
Self::Service => Err(RkError::todo()),
Self::ServiceAccount => Err(RkError::todo()),
Self::Token => Err(RkError::todo()),
}
}
}