diff --git a/config/config_arranger.edn b/config/config_arranger.edn index 8831cf77..cd711344 100644 --- a/config/config_arranger.edn +++ b/config/config_arranger.edn @@ -15,11 +15,11 @@ (layer-if :mode-pool-export "./keys_pool_file.edn") (layer-if :mode-pool-rename "./keys_clip_rename.edn") (layer-if :mode-pool-length "./keys_clip_length.edn") - (layer "./keys_global.edn") - (layer-if :mode-editor "./keys_editor.edn") - (layer-if :mode-clip "./keys_clip.edn") - (layer-if :mode-track "./keys_track.edn") - (layer-if :mode-scene "./keys_scene.edn") - (layer-if :mode-mix "./keys_mix.edn") - (layer "./keys_clock.edn") - (layer "./keys_arranger.edn")) + (layer "./keys_global.edn") + (layer-if :mode-editor "./keys_editor.edn") + (layer-if :mode-clip "./keys_clip.edn") + (layer-if :mode-track "./keys_track.edn") + (layer-if :mode-scene "./keys_scene.edn") + (layer-if :mode-mix "./keys_mix.edn") + (layer "./keys_clock.edn") + (layer "./keys_arranger.edn")) diff --git a/config/config_groovebox.edn b/config/config_groovebox.edn index 5d094df2..c3815b89 100644 --- a/config/config_groovebox.edn +++ b/config/config_groovebox.edn @@ -16,7 +16,7 @@ (layer-if :mode-pool-export "./keys_pool_file.edn") (layer-if :mode-pool-rename "./keys_clip_rename.edn") (layer-if :mode-pool-length "./keys_clip_length.edn") - (layer "./keys_global.edn") - (layer-if :mode-editor "./keys_editor.edn") - (layer "./keys_clock.edn") - (layer "./keys_arranger.edn")) + (layer "./keys_global.edn") + (layer-if :mode-editor "./keys_editor.edn") + (layer "./keys_clock.edn") + (layer "./keys_arranger.edn")) diff --git a/config/config_sequencer.edn b/config/config_sequencer.edn index 99f43230..1c1b6dfd 100644 --- a/config/config_sequencer.edn +++ b/config/config_sequencer.edn @@ -15,7 +15,7 @@ (layer-if :mode-pool-export "./keys_pool_file.edn") (layer-if :mode-pool-rename "./keys_clip_rename.edn") (layer-if :mode-pool-length "./keys_clip_length.edn") - (layer "./keys_global.edn") - (layer "./keys_editor.edn") - (layer "./keys_clock.edn") - (layer "./keys_arranger.edn")) + (layer "./keys_global.edn") + (layer "./keys_editor.edn") + (layer "./keys_clock.edn") + (layer "./keys_arranger.edn")) diff --git a/crates/app/src/config.rs b/crates/app/src/config.rs index a4474710..4be40dff 100644 --- a/crates/app/src/config.rs +++ b/crates/app/src/config.rs @@ -20,7 +20,15 @@ impl Configuration { pub fn from_source (source: impl AsRef + 'static) -> Usually { let source: Box = source.as_ref().into(); let source: &'static str = Box::leak(source); - let iter = TokenIter::from(source.as_ref()); + let [name, info, view, keys] = Self::parse(TokenIter::from(source.as_ref()))?; + Ok(Self { + info: info.map(Self::parse_info).flatten(), + name: name.map(Self::parse_name).flatten(), + view: Self::parse_view(view)?, + keys: Self::parse_keys(keys)?, + }) + } + fn parse (iter: TokenIter) -> Usually<[Option;4]> { let mut name: Option = None; let mut info: Option = None; let mut view: Option = None; @@ -35,37 +43,73 @@ impl Configuration { "info" => info = Some(exp), "keys" => keys = Some(exp), "view" => view = Some(exp), - _ => return Err(format!("(e3) unexpected symbol {sym:?}").into()) + _ => return Err( + format!("(e3) unexpected symbol {sym:?}").into() + ) }, - _ => return Err(format!("(e2) unexpected exp {:?}", next.map(|x|x.value)).into()) + _ => return Err( + format!("(e2) unexpected exp {:?}", next.map(|x|x.value)).into() + ) } }, - t => return Err(format!("(e1) unexpected token {token:?}").into()) + t => return Err( + format!("(e1) unexpected token {token:?}").into() + ) }; } - Ok(Self { - info: info.and_then(|mut x|x.next()).and_then(|x|if let Value::Str(x) = x.value { - Some(x.into()) - } else { - None - }), - name: name.and_then(|mut x|x.next()).and_then(|x|if let Value::Str(x) = x.value { - Some(x.into()) - } else { - None - }), - view: if let Some(view) = view { - view - } else { - return Err(format!("missing view definition").into()) - }, - keys: if let Some(keys) = keys { - let mut map = InputMap::default(); - // TODO add layers - map - } else { - return Err(format!("missing keys definition").into()) - }, + Ok([name, info, view, keys]) + } + fn parse_info (mut iter: TokenIter) -> Option> { + iter.next().and_then(|x|if let Value::Str(x) = x.value { + Some(x.into()) + } else { + None }) } + fn parse_name (mut iter: TokenIter) -> Option> { + iter.next().and_then(|x|if let Value::Str(x) = x.value { + Some(x.into()) + } else { + None + }) + } + fn parse_view (iter: Option) -> Usually { + if let Some(view) = iter { + Ok(view) + } else { + Err(format!("missing view definition").into()) + } + } + fn parse_keys (iter: Option) + -> Usually>> + { + if let Some(mut keys) = iter { + let mut map = InputMap::default(); + while let Some(token) = keys.next() { + match token.value { + Value::Exp(_, mut exp) => { + let next = exp.next(); + match next { + Some(Token { value: Value::Key(sym), .. }) => match sym { + "layer" => { todo!() }, + "layer-if" => { todo!() }, + _ => return Err( + format!("(e3) unexpected symbol {sym:?}").into() + ) + } + _ => return Err( + format!("(e2) unexpected exp {:?}", next.map(|x|x.value)).into() + ) + } + }, + t => return Err( + format!("(e1) unexpected token {token:?}").into() + ) + } + } + Ok(map) + } else { + return Err(format!("missing keys definition").into()) + } + } }