config: refactor, prepare to load keys

This commit is contained in:
🪞👃🪞 2025-05-02 21:44:18 +03:00
parent aefc147347
commit cd8d85bd97
4 changed files with 87 additions and 43 deletions

View file

@ -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"))

View file

@ -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"))

View file

@ -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"))

View file

@ -20,7 +20,15 @@ impl Configuration {
pub fn from_source (source: impl AsRef<str> + 'static) -> Usually<Self> {
let source: Box<str> = 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<TokenIter>;4]> {
let mut name: Option<TokenIter> = None;
let mut info: Option<TokenIter> = None;
let mut view: Option<TokenIter> = 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<Arc<str>> {
iter.next().and_then(|x|if let Value::Str(x) = x.value {
Some(x.into())
} else {
None
})
}
fn parse_name (mut iter: TokenIter) -> Option<Arc<str>> {
iter.next().and_then(|x|if let Value::Str(x) = x.value {
Some(x.into())
} else {
None
})
}
fn parse_view (iter: Option<TokenIter>) -> Usually<TokenIter> {
if let Some(view) = iter {
Ok(view)
} else {
Err(format!("missing view definition").into())
}
}
fn parse_keys (iter: Option<TokenIter>)
-> Usually<InputMap<'static, Tek, TekCommand, TuiIn, TokenIter<'static>>>
{
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())
}
}
}