Skip to main content

codeberg_cli/actions/repo/
delete.rs

1use crate::{
2    actions::GlobalArgs,
3    types::{
4        context::BergContext,
5        git::{MaybeOwnerRepo, OwnerRepo},
6    },
7};
8
9use clap::Parser;
10use miette::{Context, IntoDiagnostic};
11
12/// Delete a repository
13#[derive(Parser, Debug)]
14pub struct RepoDeleteArgs {
15    /// Repository to be deleted
16    #[arg(value_name = "REPO or OWNER/REPO")]
17    pub owner_and_repo: MaybeOwnerRepo,
18}
19
20impl RepoDeleteArgs {
21    pub async fn run(self, global_args: GlobalArgs) -> miette::Result<()> {
22        let _ = global_args;
23        let ctx = BergContext::new(self, global_args).await?;
24
25        let owner_repo = match ctx.args.owner_and_repo {
26            MaybeOwnerRepo::ImplicitOwner(repo) => {
27                let owner = ctx
28                    .client
29                    .user_get_current()
30                    .await
31                    .into_diagnostic()?
32                    .login
33                    .context("Current user has no username on targeted forgejo instance")?;
34                OwnerRepo { owner, repo }
35            }
36            MaybeOwnerRepo::ExplicitOwner(owner_repo) => owner_repo,
37        };
38
39        ctx.client
40            .repo_delete(owner_repo.owner.as_str(), owner_repo.repo.as_str())
41            .await
42            .map_err(|e| {
43                miette::miette!(
44                    help = format!(
45                        "Make sure the repository {repo_display} exists!",
46                        repo_display = owner_repo.to_string()
47                    ),
48                    "{e}"
49                )
50                .wrap_err("Deleting repository failed!")
51            })?;
52        Ok(())
53    }
54}