use anyhow::{Context, Result};
use serde::{Deserialize, Serialize};
use std::path::Path;
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NodeConfig {
pub node_id: String,
pub default_network_id: String,
pub network_ids: Vec<String>,
pub keys_name: String,
pub node_public_key: String,
pub setup_server: SetupServerConfig,
pub request_timeout_ms: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SetupServerConfig {
pub ip: String,
pub port: u16,
}
impl Default for SetupServerConfig {
fn default() -> Self {
Self {
ip: "127.0.0.1".to_string(),
port: 8080,
}
}
}
impl NodeConfig {
pub fn new(
node_id: String,
default_network_id: String,
node_public_key: String,
setup_server: SetupServerConfig,
) -> Self {
let keys_name = format!("runar_{}", Uuid::new_v4());
Self {
node_id,
default_network_id,
network_ids: Vec::new(),
keys_name,
node_public_key,
setup_server,
request_timeout_ms: 30000, }
}
pub fn load(config_dir: &Path) -> Result<Self> {
let config_file = config_dir.join("config.json");
if !config_file.exists() {
return Err(anyhow::anyhow!(
"Configuration file not found: {:?}",
config_file
));
}
let config_content = std::fs::read_to_string(&config_file)
.with_context(|| format!("Failed to read config file: {config_file:?}"))?;
let config: NodeConfig = serde_json::from_str(&config_content)
.with_context(|| format!("Failed to parse config file: {config_file:?}"))?;
Ok(config)
}
pub fn save(&self, config_dir: &Path) -> Result<()> {
let config_file = config_dir.join("config.json");
let config_content =
serde_json::to_string_pretty(self).context("Failed to serialize config")?;
std::fs::write(&config_file, config_content)
.with_context(|| format!("Failed to write config file: {config_file:?}"))?;
Ok(())
}
pub fn exists(config_dir: &Path) -> bool {
config_dir.join("config.json").exists()
}
}