From f1a0b020651852f19764e43b0b24b261ea3ddd93 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Tue, 12 Apr 2022 17:32:51 +0200 Subject: [PATCH] Move model parameter parsing out of `main` --- fj-app/src/args.rs | 27 +++++++++++++++++++++++++-- fj-app/src/main.rs | 23 ++++------------------- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/fj-app/src/args.rs b/fj-app/src/args.rs index 16cada701..aabaa3e60 100644 --- a/fj-app/src/args.rs +++ b/fj-app/src/args.rs @@ -1,5 +1,7 @@ use std::{path::PathBuf, str::FromStr as _}; +use anyhow::anyhow; +use fj_host::Parameters; use fj_kernel::algorithms::Tolerance; use fj_math::Scalar; @@ -15,8 +17,8 @@ pub struct Args { pub export: Option, /// Parameters for the model, each in the form `key=value` - #[clap(short, long)] - pub parameters: Vec, + #[clap(short, long, parse(try_from_str = parse_parameters))] + pub parameters: Option, /// Model deviation tolerance #[clap[short, long, parse(try_from_str = parse_tolerance)]] @@ -33,6 +35,27 @@ impl Args { } } +fn parse_parameters(input: &str) -> anyhow::Result { + let mut parameters = Parameters::empty(); + + for parameter in input.split(',') { + let mut parameter = parameter.splitn(2, '='); + + let key = parameter + .next() + .ok_or_else(|| anyhow!("Expected model parameter key"))? + .to_owned(); + let value = parameter + .next() + .ok_or_else(|| anyhow!("Expected model parameter value"))? + .to_owned(); + + parameters.0.insert(key, value); + } + + Ok(parameters) +} + fn parse_tolerance(input: &str) -> anyhow::Result { let tolerance = f64::from_str(input)?; let tolerance = Scalar::from_f64(tolerance); diff --git a/fj-app/src/main.rs b/fj-app/src/main.rs index 39c79a531..461a1cbbf 100644 --- a/fj-app/src/main.rs +++ b/fj-app/src/main.rs @@ -6,7 +6,7 @@ mod input; mod window; use std::path::PathBuf; -use std::{collections::HashMap, time::Instant}; +use std::time::Instant; use fj_host::{Model, Parameters}; use fj_interop::{debug::DebugInfo, mesh::Mesh}; @@ -61,29 +61,14 @@ fn main() -> anyhow::Result<()> { } let model = Model::from_path(path, config.target_dir)?; - - let mut parameters = HashMap::new(); - for parameter in args.parameters { - let mut parameter = parameter.splitn(2, '='); - - let key = parameter - .next() - .expect("model parameter: key not found") - .to_owned(); - let value = parameter - .next() - .expect("model parameter: value not found") - .to_owned(); - - parameters.insert(key, value); - } + let parameters = args.parameters.unwrap_or_else(Parameters::empty); let shape_processor = ShapeProcessor { tolerance: args.tolerance, }; if let Some(path) = args.export { - let shape = model.load_once(&Parameters(parameters))?; + let shape = model.load_once(¶meters)?; let shape = shape_processor.process(&shape); let vertices = @@ -111,7 +96,7 @@ fn main() -> anyhow::Result<()> { return Ok(()); } - let watcher = model.load_and_watch(Parameters(parameters))?; + let watcher = model.load_and_watch(parameters)?; let event_loop = EventLoop::new(); let window = Window::new(&event_loop);