use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::path::PathBuf;
use thiserror::Error;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ModuleInfo {
pub name: String,
pub version: String,
pub description: Option<String>,
pub author: Option<String>,
pub capabilities: Vec<String>,
pub dependencies: HashMap<String, String>,
pub entry_point: String,
pub directory: Option<PathBuf>,
pub binary_path: Option<PathBuf>,
pub config_schema: HashMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ModuleSource {
Path(PathBuf),
Registry {
url: String,
#[serde(skip_serializing_if = "Option::is_none")]
name: Option<String>,
},
Git { url: String, tag: Option<String> },
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum ModuleStatus {
NotInstalled,
Stopped,
Initializing,
Running,
Stopping,
Error(String),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum ModuleHealth {
Healthy,
Degraded,
Unhealthy(String),
Unknown,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
pub enum NetworkType {
Mainnet,
Testnet,
Regtest,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NodeSpec {
pub name: String,
pub version: Option<String>,
pub network: NetworkType,
pub modules: Vec<ModuleSpec>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ModuleSpec {
pub name: String,
pub version: Option<String>,
pub enabled: bool,
#[serde(default)]
pub config: HashMap<String, serde_json::Value>,
}
#[derive(Debug, Clone)]
pub struct LoadedModule {
pub info: ModuleInfo,
pub status: ModuleStatus,
pub health: ModuleHealth,
}
#[derive(Debug, Clone)]
pub struct ComposedNode {
pub spec: NodeSpec,
pub modules: Vec<LoadedModule>,
pub status: NodeStatus,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum NodeStatus {
Stopped,
Starting,
Running,
Stopping,
Error(String),
}
#[derive(Debug, Clone)]
pub struct ValidationResult {
pub valid: bool,
pub errors: Vec<String>,
pub warnings: Vec<String>,
pub dependencies: Vec<ModuleInfo>,
}
#[derive(Debug, Error)]
pub enum CompositionError {
#[error("Module not found: {0}")]
ModuleNotFound(String),
#[error("Module version not found: {0} {1}")]
ModuleVersionNotFound(String, String),
#[error("Dependency resolution failed: {0}")]
DependencyResolutionFailed(String),
#[error("Module installation failed: {0}")]
InstallationFailed(String),
#[error("Invalid configuration: {0}")]
InvalidConfiguration(String),
#[error("Composition validation failed: {0}")]
ValidationFailed(String),
#[error("IO error: {0}")]
IoError(#[from] std::io::Error),
#[error("Serialization error: {0}")]
SerializationError(String),
}
pub type Result<T> = std::result::Result<T, CompositionError>;