@@ -144,14 +144,70 @@ impl DerefMut for KeyTrieNode {
147−#[derive(Debug, Clone, PartialEq, Deserialize)]
147+#[derive(Debug, Clone, PartialEq)]
149pub enum KeyTrie {
148pub enum KeyTrie {
150 Leaf(MappableCommand),
149 Leaf(MappableCommand),
151 Sequence(Vec<MappableCommand>),
150 Sequence(Vec<MappableCommand>),
152 Node(KeyTrieNode),
151 Node(KeyTrieNode),
154+impl<'de> Deserialize<'de> for KeyTrie {
155+ fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
157+ D: serde::Deserializer<'de>,
159+ deserializer.deserialize_any(KeyTrieVisitor)
163+struct KeyTrieVisitor;
165+impl<'de> serde::de::Visitor<'de> for KeyTrieVisitor {
166+ type Value = KeyTrie;
168+ fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
169+ write!(formatter, "a command, list of commands, or sub-keymap")
172+ fn visit_str<E>(self, command: &str) -> Result<Self::Value, E>
174+ E: serde::de::Error,
177+ .parse::<MappableCommand>()
182+ fn visit_seq<S>(self, mut seq: S) -> Result<Self::Value, S::Error>
184+ S: serde::de::SeqAccess<'de>,
186+ let mut commands = Vec::new();
187+ while let Some(command) = seq.next_element::<&str>()? {
190+ .parse::<MappableCommand>()
191+ .map_err(serde::de::Error::custom)?,
194+ Ok(KeyTrie::Sequence(commands))
197+ fn visit_map<M>(self, mut map: M) -> Result<Self::Value, M::Error>
199+ M: serde::de::MapAccess<'de>,
201+ let mut mapping = HashMap::new();
202+ let mut order = Vec::new();
203+ while let Some((key, value)) = map.next_entry::<KeyEvent, KeyTrie>()? {
204+ mapping.insert(key, value);
207+ Ok(KeyTrie::Node(KeyTrieNode::new("", mapping, order)))
155impl KeyTrie {
211impl KeyTrie {
156 pub fn node(&self) -> Option<&KeyTrieNode> {
212 pub fn node(&self) -> Option<&KeyTrieNode> {
157 match *self {
213 match *self {