codeberg_cli/actions/repo/
delete.rs

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