From 49f285d8a0e49223f09de54af630673fcd79d208 Mon Sep 17 00:00:00 2001 From: plule <630159+plule@users.noreply.github.com> Date: Mon, 14 Nov 2022 13:02:53 +0100 Subject: [PATCH] Improve settings robustness --- src/settings/mod.rs | 11 ++++++++--- src/settings/v1.rs | 18 ++++++++++++++++++ src/settings/v1.yaml | 6 +++--- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/settings/mod.rs b/src/settings/mod.rs index ef881bd..aa38c92 100644 --- a/src/settings/mod.rs +++ b/src/settings/mod.rs @@ -5,6 +5,7 @@ pub type Settings = v1::Settings; pub type Preset = v1::Preset; #[derive(Clone, Serialize, Deserialize, PartialEq)] +#[serde(deny_unknown_fields)] enum Version { V1(v1::Settings), } @@ -63,6 +64,7 @@ impl Settings { #[cfg(test)] mod tests { use rstest::rstest; + use staff::midi::MidiNote; use super::*; @@ -73,9 +75,12 @@ mod tests { assert_eq!("Current", settings.current_preset.name); assert_eq!(1, settings.presets.len()); assert_eq!( - Some(staff::midi::MidiNote::from_byte(50)), - settings.presets[0].drone.notes[0] + Some(MidiNote::from_byte(50)), + settings.current_preset.drone.notes[0] ); - assert_eq!(None, settings.presets[0].drone.notes[1]); + assert_eq!(None, settings.current_preset.drone.notes[1]); + assert_eq!(0.1, settings.current_preset.mix.drone); + assert_eq!(0.9, settings.current_preset.fx.echo.mix); + assert_eq!(0.8, settings.current_preset.fx.reverb.mix); } } diff --git a/src/settings/v1.rs b/src/settings/v1.rs index 9bc5983..5654a2e 100644 --- a/src/settings/v1.rs +++ b/src/settings/v1.rs @@ -9,6 +9,7 @@ use staff::{ /// Application settings #[derive(Clone, Serialize, Deserialize, PartialEq, Default)] +#[serde(deny_unknown_fields)] pub struct Settings { /// Current sound settings #[serde(default)] @@ -21,6 +22,7 @@ pub struct Settings { /// Sound preset #[derive(Clone, Serialize, Deserialize, PartialEq)] +#[serde(deny_unknown_fields)] pub struct Preset { /// Name of the preset pub name: String, @@ -52,14 +54,20 @@ pub struct Preset { } #[derive(Clone, Serialize, Deserialize, PartialEq)] +#[serde(deny_unknown_fields)] pub struct MixSettings { + #[serde(default)] pub master: f32, + #[serde(default)] pub lead: f32, + #[serde(default)] pub guitar: f32, + #[serde(default)] pub drone: f32, } #[derive(Clone, Serialize, Deserialize, PartialEq, Default)] +#[serde(deny_unknown_fields)] pub struct FxSettings { #[serde(default)] pub echo: EchoSettings, @@ -68,21 +76,31 @@ pub struct FxSettings { } #[derive(Clone, Serialize, Deserialize, PartialEq)] +#[serde(deny_unknown_fields)] pub struct EchoSettings { + #[serde(default)] pub mix: f32, + #[serde(default)] pub duration: f32, + #[serde(default)] pub feedback: f32, } #[derive(Clone, Serialize, Deserialize, PartialEq)] +#[serde(deny_unknown_fields)] pub struct ReverbSettings { + #[serde(default)] pub mix: f32, + #[serde(default)] pub time: f32, + #[serde(default)] pub damp: f32, + #[serde(default)] pub size: f32, } #[derive(Clone, Serialize, Deserialize, PartialEq)] +#[serde(deny_unknown_fields)] pub struct DroneSettings { pub notes: [Option; 4], pub detune: f32, diff --git a/src/settings/v1.yaml b/src/settings/v1.yaml index d1cde2e..e0bbde5 100644 --- a/src/settings/v1.yaml +++ b/src/settings/v1.yaml @@ -17,14 +17,14 @@ current_preset: master: 1.0 lead: 1.0 guitar: 1.0 - drone: 0.4 + drone: 0.1 fx: echo: - mix: 1.0 + mix: 0.9 duration: 0.3 feedback: 0.46 reverb: - mix: 0.27 + mix: 0.8 time: 13.500001 damp: 0.88 size: 5.0