use std::env; use std::path::Path; use clap::Parser; pub mod cli; pub mod error; pub mod gitea; pub mod model; pub mod normalize; pub mod output; pub mod render; use crate::cli::{Cli, Commands, OutputFormat}; use crate::gitea::client::GiteaClient; use crate::normalize::normalize_bundle; use crate::output::write_output; use crate::render::json::{parse_json, render_json}; use crate::render::markdown::render_markdown; pub fn run() -> anyhow::Result<()> { let cli = Cli::parse(); match cli.command { Commands::RenderMd(args) => { let raw = std::fs::read_to_string(&args.input)?; let doc = parse_json(&raw)?; let md = render_markdown(&doc); write_output(args.out.as_deref().map(Path::new), &md)?; } Commands::Fetch(args) => { let token = required_env("GITEA_PR_CLI_API_TOKEN")?; let base_url = required_env("GITEA_PR_CLI_URL")?; let repo = required_env("GITEA_PR_CLI_REPO")?; let client = GiteaClient::new(base_url, token); let bundle = client.fetch_pr_bundle(&repo, args.pr_index)?; let doc = normalize_bundle(&repo, bundle); let rendered = match args.format { OutputFormat::Markdown => render_markdown(&doc), OutputFormat::Json => render_json(&doc)?, }; write_output(args.out.as_deref().map(Path::new), &rendered)?; } } Ok(()) } fn required_env(name: &'static str) -> anyhow::Result { env::var(name).map_err(|_| anyhow::anyhow!("missing required environment variable: {name}")) }