/
basuev
/
gverse
Обзор
Документация
Войти
/
basuev
/
gverse
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/api/refs.rs
110 строк
3 KB
basuev
initial commit: gverse v0.1.0
27 май 2026, 08:52
27 май 2026, 08:52
98b24dd
Код
Авторство
О чём код?
use crate::api::split_repo; use crate::client::Client; use crate::config::Config; use crate::error::{Error, Result}; use crate::output::{Format, print_value}; use clap::Subcommand; use reqwest::Method; use serde_json::{Map, Value}; #[derive(Subcommand, Debug)] pub enum RefsCmd { Get { repo: String, #[arg(value_name = "REF")] r#ref: String, }, Matching { repo: String, #[arg(value_name = "REF")] r#ref: String, }, Create { repo: String, #[arg(long, value_name = "REF")] r#ref: String, #[arg(long)] sha: String, }, Delete { repo: String, #[arg(value_name = "REF")] r#ref: String, #[arg(long)] yes: bool, }, } pub async fn run(cmd: RefsCmd, cfg: &Config, profile: Option<&str>, fmt: Format) -> Result<()> { let p = cfg.active_profile(profile)?; let client = Client::new(p)?; match cmd { RefsCmd::Get { repo, r#ref } => get(&client, &repo, &r#ref, fmt).await, RefsCmd::Matching { repo, r#ref } => matching(&client, &repo, &r#ref, fmt).await, RefsCmd::Create { repo, r#ref, sha } => create(&client, &repo, r#ref, sha, fmt).await, RefsCmd::Delete { repo, r#ref, yes } => delete(&client, &repo, &r#ref, yes).await, } } async fn get(client: &Client, repo: &str, r#ref: &str, fmt: Format) -> Result<()> { let (owner, name) = split_repo(repo)?; let trimmed = r#ref.trim_start_matches('/'); let v = client .get_value(&format!("/repos/{owner}/{name}/git/ref/{trimmed}"), &[]) .await?; print_value(fmt, &v); Ok(()) } async fn matching(client: &Client, repo: &str, r#ref: &str, fmt: Format) -> Result<()> { let (owner, name) = split_repo(repo)?; let trimmed = r#ref.trim_start_matches('/'); let v = client .get_value( &format!("/repos/{owner}/{name}/git/matching-refs/{trimmed}"), &[], ) .await?; print_value(fmt, &v); Ok(()) } async fn create( client: &Client, repo: &str, r#ref: String, sha: String, fmt: Format, ) -> Result<()> { let (owner, name) = split_repo(repo)?; let mut body = Map::new(); body.insert("ref".into(), Value::String(r#ref)); body.insert("sha".into(), Value::String(sha)); let v = client .send_json( Method::POST, &format!("/repos/{owner}/{name}/git/refs"), &Value::Object(body), ) .await?; print_value(fmt, &v); Ok(()) } async fn delete(client: &Client, repo: &str, r#ref: &str, yes: bool) -> Result<()> { let (owner, name) = split_repo(repo)?; let trimmed = r#ref.trim_start_matches('/'); if !yes { return Err(Error::Invalid(format!( "refusing to delete ref `{trimmed}` without --yes" ))); } client .send_empty( Method::DELETE, &format!("/repos/{owner}/{name}/git/refs/{trimmed}"), ) .await?; eprintln!("deleted ref `{trimmed}`"); Ok(()) }