github_proxy/
cli.rs

1use crate::error::ConversionError;
2use crate::proxy::Proxy;
3use crate::resource::GitHubResource;
4use std::str::FromStr as _;
5
6pub fn run() -> Result<(), Box<dyn std::error::Error>> {
7    let args: Vec<String> = std::env::args().collect();
8
9    if args.len() < 3 {
10        print_usage();
11        std::process::exit(1);
12    }
13
14    let proxy_type_str = &args[1];
15    let resource_type_str = &args[2];
16
17    // Parse proxy type
18    let proxy_type = Proxy::from_str(proxy_type_str)?;
19
20    // Parse resource based on type
21    let resource = match resource_type_str.to_lowercase().as_str() {
22        "file" => {
23            if args.len() != 7 {
24                return Err(ConversionError::InvalidArguments(
25                    "file requires 4 arguments: owner repo reference path".to_string(),
26                )
27                .into());
28            }
29            GitHubResource::file(
30                args[3].clone(),
31                args[4].clone(),
32                args[5].clone(),
33                args[6].clone(),
34            )
35        }
36        "release" => {
37            if args.len() != 7 {
38                return Err(ConversionError::InvalidArguments(
39                    "release requires 4 arguments: owner repo tag name".to_string(),
40                )
41                .into());
42            }
43            GitHubResource::release(
44                args[3].clone(),
45                args[4].clone(),
46                args[5].clone(),
47                args[6].clone(),
48            )
49        }
50        _ => {
51            return Err(ConversionError::InvalidResourceType(resource_type_str.clone()).into());
52        }
53    };
54
55    // Generate and print URL
56    let url = resource.url(&proxy_type);
57    println!("{}", url);
58
59    Ok(())
60}
61
62fn print_usage() {
63    eprintln!("Usage: github-proxy <proxy-type> <resource-type> <args...>");
64    eprintln!();
65    eprintln!("Proxy Types:");
66    eprintln!("  github      Native GitHub (no proxy)");
67    eprintln!("  gh-proxy    gh-proxy.com service");
68    eprintln!("  xget        xget.xi-xu.me service");
69    eprintln!("  jsdelivr    cdn.jsdelivr.net service");
70    eprintln!();
71    eprintln!("Resource Types:");
72    eprintln!("  file <owner> <repo> <reference> <path>");
73    eprintln!("    Generate URL for a raw file in repository");
74    eprintln!("    reference can be: branch, tag, commit hash, or refs/heads/branch");
75    eprintln!();
76    eprintln!("  release <owner> <repo> <tag> <name>");
77    eprintln!("    Generate URL for a release asset");
78    eprintln!();
79    eprintln!("Examples:");
80    eprintln!("  github-proxy xget file easy-install easy-install main install.sh");
81    eprintln!("  github-proxy xget file owner repo refs/heads/main src/lib.rs");
82    eprintln!(
83        "  github-proxy gh-proxy release easy-install easy-install nightly ei-aarch64-apple-darwin.tar.gz"
84    );
85}