Skip to content

Commit 75fa69d

Browse files
committed
feat(cli): add -s/--sizes option for custom layer sizes
Replace the fixed `SIZES` constant with a runtime list defaulting to `16,24,32,256`, parsed from a comma-separated `--sizes` argument and validated to the 1–256 range.
1 parent 8fca49e commit 75fa69d

1 file changed

Lines changed: 23 additions & 3 deletions

File tree

src/main.rs

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@ use std::{env, error::Error, fs, path::PathBuf};
22

33
use resvg::{tiny_skia, usvg};
44

5-
const SIZES: [u32; 4] = [16, 24, 32, 256];
5+
const DEFAULT_SIZES: &[u32] = &[16, 24, 32, 256];
66

77
type AnyResult<T = ()> = Result<T, Box<dyn Error>>;
88

99
fn main() -> AnyResult {
1010
let mut svg_path = None;
1111
let mut ico_path = None;
12+
let mut sizes = DEFAULT_SIZES.to_vec();
1213

1314
let mut args = env::args().skip(1);
1415
while let Some(arg) = args.next() {
@@ -19,21 +20,40 @@ fn main() -> AnyResult {
1920
};
2021
ico_path = Some(PathBuf::from(value));
2122
}
23+
"-s" | "--sizes" => {
24+
let Some(value) = args.next() else {
25+
return Err("missing value for -s/--sizes".into());
26+
};
27+
sizes = value
28+
.split(',')
29+
.map(|s| {
30+
s.trim()
31+
.parse::<u32>()
32+
.map_err(|_| format!("invalid size: {s}"))
33+
})
34+
.collect::<Result<Vec<_>, _>>()?;
35+
}
2236
_ if arg.starts_with('-') => return Err(format!("unknown option: {arg}").into()),
2337
_ => svg_path = Some(arg),
2438
}
2539
}
2640

41+
if sizes.is_empty() || sizes.iter().any(|&s| s == 0 || s > 256) {
42+
return Err("sizes must be > 0 and < 257".into());
43+
}
44+
2745
let Some(svg_path) = svg_path else {
28-
return Err("usage: svico <input.svg> [-o|--output <file.ico>]".into());
46+
return Err(
47+
"usage: svico <input.svg> [-o|--output <output.ico>] [-s|--sizes 16,24,32,256]".into(),
48+
);
2949
};
3050
let ico_path = ico_path.unwrap_or_else(|| PathBuf::from(&svg_path).with_extension("ico"));
3151

3252
let svg_data = fs::read(&svg_path)?;
3353
let svg_tree = usvg::Tree::from_data(&svg_data, &usvg::Options::default())?;
3454
let svg_size = svg_tree.size();
3555

36-
let png_layers = SIZES
56+
let png_layers = sizes
3757
.iter()
3858
.map(|&size| {
3959
let png = render_to_png(&svg_tree, &svg_size, size)?;

0 commit comments

Comments
 (0)