pub mod dwn; pub mod identity;
pub mod protocols;
pub mod vc;
pub use identity::{DIDDocument, DIDManager, IdentityManager, Web5Error, Web5Result, DID};
pub use protocols::{ProtocolDefinition, ProtocolHandler, ProtocolManager};
use std::collections::HashMap;
#[derive(Clone, Debug)]
pub struct Web5Config {
pub enabled: bool,
pub did_method: String,
pub dwn_url: Option<String>,
pub use_local_storage: bool,
}
impl Default for Web5Config {
fn default() -> Self {
Self {
enabled: true,
did_method: "ion".to_string(),
dwn_url: None,
use_local_storage: true,
}
}
}
pub struct Web5Manager {
config: Web5Config,
did_manager: identity::DIDManager,
protocol_manager: protocols::ProtocolManager,
}
impl Web5Manager {
pub fn new(config: Web5Config) -> Web5Result<Self> {
let did_manager = identity::DIDManager::new(&config.did_method);
let protocol_manager = protocols::ProtocolManager::new();
Ok(Self {
config,
did_manager,
protocol_manager,
})
}
pub fn did_manager(&self) -> &identity::DIDManager {
&self.did_manager
}
pub fn protocol_manager(&self) -> &protocols::ProtocolManager {
&self.protocol_manager
}
pub fn initialize(&mut self) -> Web5Result<()> {
let profile_handler = protocols::ProfileProtocolHandler::new();
self.protocol_manager
.register_protocol(Box::new(profile_handler))?;
if self.config.use_local_storage && self.did_manager.get_default_did()?.is_none() {
let did = self.did_manager.create_did()?;
self.did_manager.set_default_did(&did.id)?
}
Ok(())
}
pub fn status(&self) -> Web5Result<Web5Status> {
let did_count = self.did_manager.dids()?.len();
let protocol_count = self.protocol_manager.get_all_protocols().len();
Ok(Web5Status {
enabled: self.config.enabled,
did_count,
protocol_count,
dwn_connected: self.config.dwn_url.is_some(),
})
}
pub fn get_metrics(&self) -> Web5Result<HashMap<String, String>> {
let mut metrics = HashMap::new();
metrics.insert(
"dids".to_string(),
self.did_manager.dids()?.len().to_string(),
);
metrics.insert(
"protocols".to_string(),
self.protocol_manager.get_all_protocols().len().to_string(),
);
metrics.insert(
"dwn_connected".to_string(),
self.config.dwn_url.is_some().to_string(),
);
Ok(metrics)
}
}
#[derive(Clone, Debug)]
pub struct Web5Status {
pub enabled: bool,
pub did_count: usize,
pub protocol_count: usize,
pub dwn_connected: bool,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_web5_manager_creation() -> Result<(), Box<dyn std::error::Error>> {
let config = Web5Config::default();
let manager = Web5Manager::new(config)?;
assert!(manager.config.enabled);
assert_eq!(manager.config.did_method, "ion");
Ok(())
}
#[test]
fn test_web5_status() -> Result<(), Box<dyn std::error::Error>> {
let config = Web5Config::default();
let manager = Web5Manager::new(config)?;
let status = manager.status()?;
assert!(status.enabled);
assert_eq!(status.did_count, 0);
assert_eq!(status.protocol_count, 0);
assert!(!status.dwn_connected);
Ok(())
}
}