d3xs-protocol 0.1.0

Physical access control (protocol)
Documentation
use serde::{Deserialize, Serialize};
use std::collections::HashMap;

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Config {
    pub public_key: String,
    #[serde(default)]
    pub users: HashMap<String, User>,
    #[serde(default)]
    pub doors: HashMap<String, Door>,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct User {
    #[serde(default)]
    pub authorize: Vec<String>,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Door {
    pub label: String,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum Event {
    Config,
    Challenge(Challenge),
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Challenge {
    pub user: String,
    pub challenge: String,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ClientRequest {
    Fetch(Fetch),
    Solve(Solve),
}

#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
pub struct Fetch {
    pub user: Option<String>,
    pub door: String,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Solve {
    pub user: Option<String>,
    pub door: String,
    pub code: String,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ClientResponse {
    Config(UiConfig),
    Challenge(Challenge),
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct UiConfig {
    pub public_key: String,
    pub doors: Vec<UiDoor>,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct UiDoor {
    pub id: String,
    pub label: String,
}

impl UiDoor {
    pub fn new(id: String, config: Door) -> Self {
        Self {
            id,
            label: config.label,
        }
    }
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum BridgeResponse {
    Config(Config),
    Challenge(Challenge),
}