codeberg_cli/actions/repo/
delete.rs1use crate::{
2 actions::GlobalArgs,
3 types::{context::BergContext, git::OwnerRepo},
4};
5
6use clap::Parser;
7use miette::{Context, IntoDiagnostic};
8
9#[derive(Parser, Debug)]
11pub struct RepoDeleteArgs {
12 #[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}