walletconnect 0.1.0

WalletConnect client implementation in Rust.
Documentation
use super::Topic;
use crate::serialization;
use serde::{Deserialize, Serialize};

#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct SocketMessage {
    pub topic: Topic,
    #[serde(rename = "type")]
    pub kind: SocketMessageKind,
    #[serde(with = "serialization::jsonstring")]
    pub payload: Option<EncryptionPayload>,
    #[serde(default)]
    pub silent: bool,
}

#[derive(Copy, Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum SocketMessageKind {
    Pub,
    Sub,
}

#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct EncryptionPayload {
    #[serde(with = "serialization::hexstring")]
    pub data: Vec<u8>,
    #[serde(with = "serialization::hexstring")]
    pub hmac: Vec<u8>,
    #[serde(with = "serialization::hexstring")]
    pub iv: Vec<u8>,
}

#[cfg(test)]
mod tests {
    use super::*;
    use serde_json::json;

    #[test]
    fn message_serialization() {
        let message = SocketMessage {
            topic: "de5682be-2a03-4b8e-866e-1e89dbca422b".parse().unwrap(),
            kind: SocketMessageKind::Pub,
            payload: Some(EncryptionPayload {
                data: vec![0x04, 0x2],
                hmac: vec![0x13, 0x37],
                iv: vec![0x00],
            }),
            silent: false,
        };
        let json = json!({
            "topic": "de5682be-2a03-4b8e-866e-1e89dbca422b",
            "type": "pub",
            "payload": "{\"data\":\"0402\",\"hmac\":\"1337\",\"iv\":\"00\"}",
            "silent": false,
        });

        assert_eq!(serde_json::to_value(&message).unwrap(), json);
        assert_eq!(
            serde_json::from_value::<SocketMessage>(json).unwrap(),
            message
        );
    }
}