summaryrefslogtreecommitdiffstats
path: root/src/main.rs
blob: 78f17f8970b20657d56469ed837e57ad6e394cf4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
mod downloader;

#[cfg(feature = "gui")]
mod gui;

// ---------------------------------------------------------------------------
// GUI entry point (when the "gui" feature is enabled)
// ---------------------------------------------------------------------------
#[cfg(feature = "gui")]
fn main() -> eframe::Result<()> {
    let options = eframe::NativeOptions {
        viewport: egui::ViewportBuilder::default()
            .with_inner_size([800.0, 650.0])
            .with_min_inner_size([600.0, 400.0]),
        ..Default::default()
    };

    eframe::run_native(
        "Factorio Mod Downloader",
        options,
        Box::new(|_cc| Ok(Box::new(gui::App::new()))),
    )
}

// ---------------------------------------------------------------------------
// CLI entry point (when the "gui" feature is disabled)
// ---------------------------------------------------------------------------
#[cfg(not(feature = "gui"))]
fn main() {
    let args: Vec<String> = std::env::args().collect();

    if args.len() < 2 {
        eprintln!("Factorio Mod Downloader (CLI)");
        eprintln!();
        eprintln!(
            "Usage: {} <mod_url_or_name> [output_directory] [options]",
            args[0]
        );
        eprintln!();
        eprintln!("Options:");
        eprintln!("  --version <VER>       Download a specific version instead of latest");
        eprintln!("  --include-optional    Also download optional dependencies");
        eprintln!();
        eprintln!("Examples:");
        eprintln!("  {} my-cool-mod", args[0]);
        eprintln!(
            "  {} https://mods.factorio.com/mod/my-cool-mod ./mods",
            args[0]
        );
        eprintln!(
            "  {} my-cool-mod ./mods --version 2.1.0 --include-optional",
            args[0]
        );
        std::process::exit(1);
    }

    let mod_url = &args[1];

    let output = if args.len() >= 3 && !args[2].starts_with("--") {
        std::path::PathBuf::from(&args[2])
    } else {
        std::env::current_dir().unwrap_or_else(|_| std::path::PathBuf::from("."))
    };

    let mut target_version: Option<&str> = None;
    let mut include_optional = false;

    let mut i = if args.len() >= 3 && !args[2].starts_with("--") {
        3
    } else {
        2
    };
    while i < args.len() {
        match args[i].as_str() {
            "--version" => {
                if i + 1 < args.len() {
                    target_version = Some(&args[i + 1]);
                    i += 1;
                } else {
                    eprintln!("Error: --version requires a value");
                    std::process::exit(1);
                }
            }
            "--include-optional" => {
                include_optional = true;
            }
            other => {
                eprintln!("Unknown option: {other}");
                std::process::exit(1);
            }
        }
        i += 1;
    }

    match downloader::run_cli_download(mod_url, &output, target_version, include_optional) {
        Ok(()) => {}
        Err(e) => {
            eprintln!("Error: {:#}", e);
            std::process::exit(1);
        }
    }
}