enigma-node-types 0.0.1

Canonical node-facing types and strict codecs for Enigma (UserId hashing, identities, presence, relay envelopes).
Documentation
use serde::{Deserialize, Serialize};

use crate::error::{EnigmaNodeTypesError, Result};

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct NodeInfo {
    pub base_url: String,
}

impl NodeInfo {
    pub fn validate(&self) -> Result<()> {
        let trimmed = self.base_url.trim();
        if trimmed.is_empty() || trimmed.len() > 256 {
            return Err(EnigmaNodeTypesError::InvalidField("base_url"));
        }
        if !(trimmed.starts_with("http://") || trimmed.starts_with("https://")) {
            return Err(EnigmaNodeTypesError::InvalidField("base_url"));
        }
        Ok(())
    }
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct NodesPayload {
    pub nodes: Vec<NodeInfo>,
}

impl NodesPayload {
    pub fn validate(&self) -> Result<()> {
        for node in &self.nodes {
            node.validate()?;
        }
        Ok(())
    }
}