diff --git a/src/projects/create.rs b/src/projects/create.rs index b676e75c..69946562 100644 --- a/src/projects/create.rs +++ b/src/projects/create.rs @@ -65,7 +65,7 @@ fn is_conflict_error(err: &anyhow::Error) -> bool { }) } -pub async fn run(client: &ApiClient, name: Option<&str>) -> Result<()> { +pub async fn run(client: &ApiClient, name: Option<&str>, json: bool) -> Result<()> { let name = match name { Some(n) if !n.is_empty() => n.to_string(), _ => { @@ -77,7 +77,11 @@ pub async fn run(client: &ApiClient, name: Option<&str>) -> Result<()> { }; match create_project_checked(client, &name).await { - Ok(CreateProjectOutcome::Created(_)) => { + Ok(CreateProjectOutcome::Created(project)) => { + if json { + println!("{}", serde_json::to_string(&project)?); + return Ok(()); + } print_command_status( CommandStatus::Success, &format!("Successfully created '{name}'"), diff --git a/src/projects/delete.rs b/src/projects/delete.rs index 61ae0ac4..cedd1f00 100644 --- a/src/projects/delete.rs +++ b/src/projects/delete.rs @@ -9,7 +9,7 @@ use crate::ui::{ use super::api; -pub async fn run(client: &ApiClient, name: Option<&str>, force: bool) -> Result<()> { +pub async fn run(client: &ApiClient, name: Option<&str>, force: bool, json: bool) -> Result<()> { if force && name.is_none() { bail!("project name required when using --force. Use: bt projects delete --force"); } @@ -33,6 +33,15 @@ pub async fn run(client: &ApiClient, name: Option<&str>, force: bool) -> Result< .interact()?; if !confirm { + if json { + println!( + "{}", + serde_json::to_string(&serde_json::json!({ + "deleted": false, + "project": project, + }))? + ); + } return Ok(()); } } @@ -44,6 +53,16 @@ pub async fn run(client: &ApiClient, name: Option<&str>, force: bool) -> Result< .await { Ok(_) => { + if json { + println!( + "{}", + serde_json::to_string(&serde_json::json!({ + "deleted": true, + "project": project, + }))? + ); + return Ok(()); + } print_command_status( CommandStatus::Success, &format!("Deleted '{}'", project.name), diff --git a/src/projects/mod.rs b/src/projects/mod.rs index 5b630b00..797168a6 100644 --- a/src/projects/mod.rs +++ b/src/projects/mod.rs @@ -77,10 +77,14 @@ pub async fn run(base: BaseArgs, args: ProjectsArgs) -> Result<()> { match args.command { None | Some(ProjectsCommands::List) => list::run(&client, &org_name, base.json).await, - Some(ProjectsCommands::Create(a)) => create::run(&client, a.name.as_deref()).await, + Some(ProjectsCommands::Create(a)) => { + create::run(&client, a.name.as_deref(), base.json).await + } Some(ProjectsCommands::View(a)) => { - view::run(&client, &ctx.app_url, &org_name, a.name()).await + view::run(&client, &ctx.app_url, &org_name, a.name(), base.json).await + } + Some(ProjectsCommands::Delete(a)) => { + delete::run(&client, a.name.as_deref(), a.force, base.json).await } - Some(ProjectsCommands::Delete(a)) => delete::run(&client, a.name.as_deref(), a.force).await, } } diff --git a/src/projects/view.rs b/src/projects/view.rs index 4497e4ab..f76348a9 100644 --- a/src/projects/view.rs +++ b/src/projects/view.rs @@ -14,25 +14,26 @@ pub async fn run( app_url: &str, org_name: &str, name: Option<&str>, + json: bool, ) -> Result<()> { - let project_name = match name { - Some(n) => { - with_spinner("Loading project...", api::get_project_by_name(client, n)) - .await? - .ok_or_else(|| anyhow::anyhow!("project '{n}' not found"))? - .name - } + let project = match name { + Some(n) => with_spinner("Loading project...", api::get_project_by_name(client, n)) + .await? + .ok_or_else(|| anyhow::anyhow!("project '{n}' not found"))?, None => { if !is_interactive() { bail!("project name required. Use: bt projects view ") } - select_project(client, None, None, ProjectSelectMode::ExistingOnly) - .await? - .name + select_project(client, None, None, ProjectSelectMode::ExistingOnly).await? } }; - let url = app_project_url(app_url, org_name, &project_name, &[]); + if json { + println!("{}", serde_json::to_string(&project)?); + return Ok(()); + } + + let url = app_project_url(app_url, org_name, &project.name, &[]); open::that(&url)?; print_command_status(CommandStatus::Success, &format!("Opened {url} in browser"));