pub mod cache;
pub mod registry;
pub use cache::{CacheEntry, CacheKey, EdgeCache, EdgeCacheStats};
pub use registry::{EdgeNode, EdgeRegistry, InvalidationEvent};
use serde::{Deserialize, Serialize};
use std::time::Duration;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EdgeConfig {
pub role: EdgeRole,
#[serde(default)]
pub home_url: String,
#[serde(default)]
pub auth_token: String,
pub default_ttl: Duration,
pub max_entries: usize,
pub max_edges: usize,
}
impl Default for EdgeConfig {
fn default() -> Self {
Self {
role: EdgeRole::Home,
home_url: String::new(),
auth_token: String::new(),
default_ttl: Duration::from_secs(60),
max_entries: 10_000,
max_edges: 32,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum EdgeRole {
Home,
Edge,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_role_is_home() {
let cfg = EdgeConfig::default();
assert_eq!(cfg.role, EdgeRole::Home);
}
#[test]
fn config_round_trips_through_serde() {
let cfg = EdgeConfig {
role: EdgeRole::Edge,
home_url: "https://home.svc:9090".into(),
auth_token: "tkn".into(),
default_ttl: Duration::from_secs(30),
max_entries: 5_000,
max_edges: 0,
};
let json = serde_json::to_string(&cfg).unwrap();
let back: EdgeConfig = serde_json::from_str(&json).unwrap();
assert_eq!(back.role, EdgeRole::Edge);
assert_eq!(back.home_url, "https://home.svc:9090");
assert_eq!(back.default_ttl, Duration::from_secs(30));
}
}