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);
}
}
}
|