From 7b85b7e4287bb9e72f0d165ec9f694b594133a24 Mon Sep 17 00:00:00 2001 From: Amadeusz Wieczorek Date: Sun, 5 Jul 2026 14:19:50 -0700 Subject: [PATCH 1/3] Use default values for properties missing from --settings file --- cli/src/main.rs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/cli/src/main.rs b/cli/src/main.rs index 36b93c5..d19e20b 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -122,7 +122,9 @@ fn main() -> io::Result<()> { let settings = { let mut settings = if let Some(path) = opt.settings { - serde_json::from_reader(File::open(path)?)? + let defaults = serde_json::to_value(Settings::default()).unwrap(); + let overrides = serde_json::from_reader(File::open(path)?)?; + serde_json::from_value(merge(defaults, overrides))? } else { Settings::default() }; @@ -384,3 +386,16 @@ fn main() -> io::Result<()> { ) } } + +fn merge(defaults: serde_json::Value, overrides: serde_json::Value) -> serde_json::Value { + match (defaults, overrides) { + (serde_json::Value::Object(mut defaults), serde_json::Value::Object(overrides)) => { + for (k, v) in overrides { + let existing = defaults.remove(&k).unwrap_or(serde_json::Value::Null); + defaults.insert(k, merge(existing, v)); + } + serde_json::Value::Object(defaults) + } + (_, overrides) => overrides, + } +} From 3a9f960d9e58147c27a7f094082a7c75dd205c1f Mon Sep 17 00:00:00 2001 From: Amadeusz Wieczorek Date: Tue, 14 Jul 2026 21:53:22 -0700 Subject: [PATCH 2/3] Revert "Use default values for properties missing from --settings file" This reverts commit 7b85b7e4287bb9e72f0d165ec9f694b594133a24. --- cli/src/main.rs | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/cli/src/main.rs b/cli/src/main.rs index d19e20b..36b93c5 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -122,9 +122,7 @@ fn main() -> io::Result<()> { let settings = { let mut settings = if let Some(path) = opt.settings { - let defaults = serde_json::to_value(Settings::default()).unwrap(); - let overrides = serde_json::from_reader(File::open(path)?)?; - serde_json::from_value(merge(defaults, overrides))? + serde_json::from_reader(File::open(path)?)? } else { Settings::default() }; @@ -386,16 +384,3 @@ fn main() -> io::Result<()> { ) } } - -fn merge(defaults: serde_json::Value, overrides: serde_json::Value) -> serde_json::Value { - match (defaults, overrides) { - (serde_json::Value::Object(mut defaults), serde_json::Value::Object(overrides)) => { - for (k, v) in overrides { - let existing = defaults.remove(&k).unwrap_or(serde_json::Value::Null); - defaults.insert(k, merge(existing, v)); - } - serde_json::Value::Object(defaults) - } - (_, overrides) => overrides, - } -} From cdf61d7c7e11a4996674d824e3adec532c9a7019 Mon Sep 17 00:00:00 2001 From: Amadeusz Wieczorek Date: Tue, 14 Jul 2026 22:46:14 -0700 Subject: [PATCH 3/3] Add serde(default) on all configuration properties to make them optional --- g_code/src/config/mod.rs | 8 +++++--- star/src/lower/mod.rs | 4 +--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/g_code/src/config/mod.rs b/g_code/src/config/mod.rs index 3cc9f19..53a61c3 100644 --- a/g_code/src/config/mod.rs +++ b/g_code/src/config/mod.rs @@ -23,6 +23,7 @@ mod v5; /// A cross-platform type used to store all configuration types. #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde", serde(default))] #[derive(Debug, Default, Clone, PartialEq)] pub struct Settings { pub conversion: GCodeConfig, @@ -33,6 +34,7 @@ pub struct Settings { } #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde", serde(default))] #[derive(Debug, Default, Clone, PartialEq)] pub struct MachineConfig { pub supported_functionality: SupportedFunctionality, @@ -43,6 +45,7 @@ pub struct MachineConfig { } #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde", serde(default))] #[derive(Debug, Clone, PartialEq)] pub struct GCodeConfig { #[cfg_attr(feature = "serde", serde(flatten))] @@ -63,6 +66,7 @@ impl Default for GCodeConfig { #[derive(Debug, Default, Clone, PartialEq)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde", serde(default))] pub struct SupportedFunctionality { /// Indicates support for G2/G3 circular interpolation. /// @@ -71,17 +75,15 @@ pub struct SupportedFunctionality { } #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde", serde(default))] #[derive(Debug, Default, Clone, PartialEq)] /// Operations performed after G-Code generation. pub struct PostprocessConfig { /// Convenience field for [g_code::emit::FormatOptions] field - #[cfg_attr(feature = "serde", serde(default))] pub checksums: bool, /// Convenience field for [g_code::emit::FormatOptions] field - #[cfg_attr(feature = "serde", serde(default))] pub line_numbers: bool, /// Convenience field for [g_code::emit::FormatOptions] field - #[cfg_attr(feature = "serde", serde(default))] pub newline_before_comment: bool, } diff --git a/star/src/lower/mod.rs b/star/src/lower/mod.rs index 9b91093..f9c337f 100644 --- a/star/src/lower/mod.rs +++ b/star/src/lower/mod.rs @@ -30,23 +30,21 @@ mod visit; /// High-level output configuration #[derive(Debug, Clone, PartialEq)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde", serde(default))] pub struct ConversionConfig { /// Dots per inch for pixels, picas, points, etc. pub dpi: f64, /// Set the origin point in millimeters for this conversion - #[cfg_attr(feature = "serde", serde(default = "zero_origin"))] pub origin: [Option; 2], /// Set extra attribute to add when printing node name pub extra_attribute_name: Option, /// Reorder paths to minimize travel time - #[cfg_attr(feature = "serde", serde(default))] pub optimize_path_order: bool, /// CSS selector to filter which SVG elements are converted. /// /// Only the `:not`, `:is`, and `:has` pseudo classes are supported. /// /// - #[cfg_attr(feature = "serde", serde(default))] pub selector_filter: Option, pub starting_point: [Option; 2], }