mod assets;
mod checklists;
mod submittals;
use anyhow::Result;
use clap::Subcommand;
use std::path::PathBuf;
use crate::output::OutputFormat;
use raps_acc::AccClient;
#[derive(Debug, Subcommand)]
pub enum AccCommands {
#[command(subcommand)]
Asset(AssetCommands),
#[command(subcommand)]
Submittal(SubmittalCommands),
#[command(subcommand)]
Checklist(ChecklistCommands),
}
#[derive(Debug, Subcommand)]
pub enum AssetCommands {
List {
project_id: String,
},
Get {
project_id: String,
asset_id: String,
},
Create {
project_id: String,
#[arg(long)]
description: Option<String>,
#[arg(long)]
barcode: Option<String>,
#[arg(long)]
category_id: Option<String>,
},
Update {
project_id: String,
asset_id: String,
#[arg(long)]
description: Option<String>,
#[arg(long)]
barcode: Option<String>,
#[arg(long)]
status_id: Option<String>,
},
Delete {
project_id: String,
asset_id: String,
},
}
#[derive(Debug, Subcommand)]
pub enum SubmittalCommands {
List {
project_id: String,
},
Get {
project_id: String,
submittal_id: String,
},
Create {
project_id: String,
#[arg(long)]
title: Option<String>,
#[arg(long)]
spec_section: Option<String>,
#[arg(long)]
due_date: Option<String>,
#[arg(long, value_name = "FILE")]
from_csv: Option<PathBuf>,
},
Update {
project_id: String,
submittal_id: String,
#[arg(long)]
title: Option<String>,
#[arg(long)]
status: Option<String>,
#[arg(long)]
due_date: Option<String>,
},
Delete {
project_id: String,
submittal_id: String,
},
}
#[derive(Debug, Subcommand)]
pub enum ChecklistCommands {
List {
project_id: String,
},
Get {
project_id: String,
checklist_id: String,
},
Create {
project_id: String,
#[arg(long)]
title: String,
#[arg(long)]
template_id: Option<String>,
#[arg(long)]
location: Option<String>,
#[arg(long)]
due_date: Option<String>,
#[arg(long)]
assignee_id: Option<String>,
},
Update {
project_id: String,
checklist_id: String,
#[arg(long)]
title: Option<String>,
#[arg(long)]
status: Option<String>,
#[arg(long)]
location: Option<String>,
#[arg(long)]
due_date: Option<String>,
},
Templates {
project_id: String,
},
}
pub(super) fn truncate_str(s: &str, max_len: usize) -> String {
if s.len() <= max_len {
s.to_string()
} else {
format!("{}...", &s[..max_len - 3])
}
}
impl AccCommands {
pub async fn execute(self, client: &AccClient, output_format: OutputFormat) -> Result<()> {
match self {
AccCommands::Asset(cmd) => cmd.execute(client, output_format).await,
AccCommands::Submittal(cmd) => cmd.execute(client, output_format).await,
AccCommands::Checklist(cmd) => cmd.execute(client, output_format).await,
}
}
}
impl AssetCommands {
pub async fn execute(self, client: &AccClient, output_format: OutputFormat) -> Result<()> {
match self {
AssetCommands::List { project_id } => {
assets::list_assets(client, &project_id, output_format).await
}
AssetCommands::Get {
project_id,
asset_id,
} => assets::get_asset(client, &project_id, &asset_id, output_format).await,
AssetCommands::Create {
project_id,
description,
barcode,
category_id,
} => {
assets::create_asset(
client,
&project_id,
description,
barcode,
category_id,
output_format,
)
.await
}
AssetCommands::Update {
project_id,
asset_id,
description,
barcode,
status_id,
} => {
assets::update_asset(
client,
&project_id,
&asset_id,
description,
barcode,
status_id,
output_format,
)
.await
}
AssetCommands::Delete {
project_id,
asset_id,
} => assets::delete_asset(client, &project_id, &asset_id, output_format).await,
}
}
}
impl SubmittalCommands {
pub async fn execute(self, client: &AccClient, output_format: OutputFormat) -> Result<()> {
match self {
SubmittalCommands::List { project_id } => {
submittals::list_submittals(client, &project_id, output_format).await
}
SubmittalCommands::Get {
project_id,
submittal_id,
} => submittals::get_submittal(client, &project_id, &submittal_id, output_format).await,
SubmittalCommands::Create {
project_id,
title,
spec_section,
due_date,
from_csv,
} => {
submittals::create_submittal(
client,
&project_id,
title,
spec_section,
due_date,
from_csv,
output_format,
)
.await
}
SubmittalCommands::Update {
project_id,
submittal_id,
title,
status,
due_date,
} => {
submittals::update_submittal(
client,
&project_id,
&submittal_id,
title,
status,
due_date,
output_format,
)
.await
}
SubmittalCommands::Delete {
project_id,
submittal_id,
} => {
submittals::delete_submittal(client, &project_id, &submittal_id, output_format)
.await
}
}
}
}
impl ChecklistCommands {
pub async fn execute(self, client: &AccClient, output_format: OutputFormat) -> Result<()> {
match self {
ChecklistCommands::List { project_id } => {
checklists::list_checklists(client, &project_id, output_format).await
}
ChecklistCommands::Get {
project_id,
checklist_id,
} => checklists::get_checklist(client, &project_id, &checklist_id, output_format).await,
ChecklistCommands::Create {
project_id,
title,
template_id,
location,
due_date,
assignee_id,
} => {
checklists::create_checklist(
client,
&project_id,
&title,
template_id,
location,
due_date,
assignee_id,
output_format,
)
.await
}
ChecklistCommands::Update {
project_id,
checklist_id,
title,
status,
location,
due_date,
} => {
checklists::update_checklist(
client,
&project_id,
&checklist_id,
title,
status,
location,
due_date,
output_format,
)
.await
}
ChecklistCommands::Templates { project_id } => {
checklists::list_templates(client, &project_id, output_format).await
}
}
}
}