virtual-input 0.2.0

API for interacting with virtual input devices
Documentation
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 +",
        );
    }
}