mirror of
https://github.com/storytold/photocraft.git
synced 2026-10-28 10:11:58 +01:00
Step 3 of the issue: handlers get values that are already checked, so a bad one is a clap usage error naming its flag (exit 2) and the "bad --x" errors (exit 1) are gone. - --quality is a u8 in 1..=100; --tga-bits, --dpx-bits and --dds-compression parse to photocraft_io's TgaBits, DpxBits and DdsCompression through their from_bits/from_name, and --tiff-compression and --jpeg-format to photocraft_codecs' TiffCompression and JpegFormat, refusing a bad one with a typed ValueError; serve --port is a u16. export_opts becomes `impl From<&ExportArgs> for ExportOptions`, which can't fail. - run's --new and --params parse to serde_json::Value, so JSON that doesn't parse is a usage error; whether it is an object is still the command's to say (exit 1). The --cmd/--params pairing keeps using ArgMatches::indices_of, now over typed Step values. - Paths are PathBufs (convert, info, run, batch, the control token file and automation roots), and run hands the OsStrings to clap instead of refusing non-Unicode up front: a Latin-1 file name works as a path (#1108), and one given as text is clap's usage error. load_actions_file takes a &Path, and photocraft_engine's same_file takes any AsRef<Path>, so convert's #7437 check compares the PathBufs. - Rules live in the types: run needs exactly one of <FILE> or --new (ArgGroup "source") and a --cmd or --out ("work"); batch's --actions, --in and --out are required; --control-token conflicts with --control-token-file. The runtime checks and their messages are deleted. The automation crate's own token check stays, as it also sees PHOTOCRAFT_CONTROL_TOKEN(_FILE). Tests changed for this: run_errors, quality_outside_1_to_100_is_refused, dpx_converts_both_ways_with_the_bits_asked_for, dds_converts_both_ways_with_the_compression_asked_for, tga_bits_choose_the_targa_depth, jpeg_format_chooses_the_scans (exit 2, the error names the flag) and the #1108 test, now a_non_unicode_path_is_taken_and_non_unicode_text_is_a_usage_error: convert reads and writes such a file name end to end, while info opens through the automation layer, whose paths must still be UTF-8, and refuses it (exit 1). either_or_flags_are_usage_errors is new. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>