//! `subscription [--watch|--ignore|--unwatch] [repo]` — get or set //! the current user's watch subscription for a repo. use anyhow::Result; use clap::Args as ClapArgs; use serde_json::{Value, json}; use crate::client::Client; use crate::verbs::print_json; #[derive(ClapArgs)] pub struct Args { /// Subscribe (watch the repo). #[arg(long, group = "action")] watch: bool, /// Mute (mark ignored). #[arg(long, group = "action")] ignore: bool, /// Unsubscribe (clear watch + ignore). #[arg(long, group = "action")] unwatch: bool, } pub fn run(client: &Client, args: Args) -> Result<()> { let repo = client.repo(); if args.unwatch { client.delete(&format!("/repos/{repo}/subscription"), None)?; println!("unsubscribed"); return Ok(()); } if args.watch || args.ignore { let (subscribed, ignored) = if args.ignore { (false, true) } else { (true, false) }; let resp = client.post_json( &format!("/repos/{repo}/subscription"), &json!({ "subscribed": subscribed, "ignored": ignored }), )?; return print_json(&json!({ "subscribed": resp.get("subscribed"), "ignored": resp.get("ignored"), })); } let resp: Value = client.get_json(&format!("/repos/{repo}/subscription"))?; print_json(&json!({ "subscribed": resp.get("subscribed"), "ignored": resp.get("ignored"), })) }