use crate::keyboard::KeyboardKeys;
use serde::de::Visitor;
use serde::de::{Error, Unexpected};
use serde::{Deserialize, Deserializer};
use std::convert::TryFrom;
use std::fmt;
struct KeyboardKeysVisitor;
impl<'de> Visitor<'de> for KeyboardKeysVisitor {
type Value = KeyboardKeys;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
write!(formatter, "an string of keyboard keys separated with +")
}
fn visit_str<E: Error>(self, v: &str) -> Result<Self::Value, E> {
match KeyboardKeys::try_from(v) {
Ok(keys) => Ok(keys),
Err(_) => Err(Error::invalid_value(Unexpected::Str(v), &self)),
}
}
}
impl<'de> Deserialize<'de> for KeyboardKeys {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
deserializer.deserialize_str(KeyboardKeysVisitor)
}
}
#[cfg(test)]
mod tests {
use crate::keyboard::{KeyboardKey, KeyboardKeys};
use serde_test::{assert_de_tokens, assert_de_tokens_error, Token};
#[test]
fn test_keys_click_deserialize_ok() {
let keys1 = KeyboardKeys::new().add_key(KeyboardKey::L);
let keys2 = KeyboardKeys::new()
.add_key(KeyboardKey::RightShift)
.add_key(KeyboardKey::H);
let keys3 = KeyboardKeys::new()
.add_key(KeyboardKey::H)
.add_key(KeyboardKey::E)
.add_key(KeyboardKey::L);
assert_de_tokens(&keys1, &[Token::String("l")]);
assert_de_tokens(&keys2, &[Token::String("right-shift+h")]);
assert_de_tokens(&keys3, &[Token::String("h+e+l")]);
}
#[test]
fn test_keys_click_deserialize_error() {
assert_de_tokens_error::<KeyboardKeys>(
&[Token::Str("")],
"invalid value: string \"\", expected an string of keyboard keys separated with +",
);
assert_de_tokens_error::<KeyboardKeys>(
&[Token::Str("test")],
"invalid value: string \"test\", expected an string of keyboard keys separated with +",
);
}
}