use serde_json::Value;
use std::fs;
use std::path::Path;
#[derive(Debug, Clone)]
pub struct NeutralIpcConfig {
host: String,
port: u16,
timeout: u16,
buffer_size: usize,
config_file: String,
}
impl Default for NeutralIpcConfig {
fn default() -> Self {
Self {
host: "127.0.0.1".to_string(),
port: 4273,
timeout: 10,
buffer_size: 8192,
config_file: "/etc/neutral-ipc-cfg.json".to_string(),
}
}
}
impl NeutralIpcConfig {
pub fn new() -> Self {
let mut config = Self::default();
config.load_from_config_file();
config
}
fn load_from_config_file(&mut self) {
let file_config = self.load_config();
if let Value::Object(_) = file_config {
if let Some(host) = file_config.get("host").and_then(|v| v.as_str()) {
self.host = host.to_string();
}
if let Some(port) = file_config.get("port").and_then(|v| v.as_u64()) {
self.port = port as u16;
}
if let Some(timeout) = file_config.get("timeout").and_then(|v| v.as_u64()) {
self.timeout = timeout as u16;
}
if let Some(buffer_size) = file_config.get("buffer_size").and_then(|v| v.as_u64()) {
self.buffer_size = buffer_size as usize;
}
}
}
fn load_config(&self) -> Value {
if !Path::new(&self.config_file).exists() {
return Value::Null;
}
match fs::read_to_string(&self.config_file) {
Ok(content) => {
match serde_json::from_str(&content) {
Ok(config) => config,
Err(_) => Value::Null,
}
}
Err(_) => Value::Null,
}
}
pub fn get_host(&self) -> String {
self.host.clone()
}
pub fn get_port(&self) -> u16 {
self.port
}
pub fn get_timeout(&self) -> u16 {
self.timeout
}
pub fn get_buffer_size(&self) -> usize {
self.buffer_size
}
pub fn get_config_file(&self) -> String {
self.config_file.clone()
}
pub fn set_host(&mut self, host: String) {
self.host = host;
}
pub fn set_port(&mut self, port: u16) {
self.port = port;
}
pub fn set_timeout(&mut self, timeout: u16) {
self.timeout = timeout;
}
pub fn set_buffer_size(&mut self, buffer_size: usize) {
self.buffer_size = buffer_size;
}
pub fn set_config_file(&mut self, config_file: String) {
self.config_file = config_file;
self.load_from_config_file();
}
pub fn update_settings(&mut self, settings: Value) {
let should_reload = if let Value::Object(settings_map) = &settings {
settings_map.get("config_file").and_then(|v| v.as_str()).is_some()
} else {
false
};
if let Value::Object(settings_map) = settings {
if let Some(host) = settings_map.get("host").and_then(|v| v.as_str()) {
self.host = host.to_string();
}
if let Some(port) = settings_map.get("port").and_then(|v| v.as_u64()) {
self.port = port as u16;
}
if let Some(timeout) = settings_map.get("timeout").and_then(|v| v.as_u64()) {
self.timeout = timeout as u16;
}
if let Some(buffer_size) = settings_map.get("buffer_size").and_then(|v| v.as_u64()) {
self.buffer_size = buffer_size as usize;
}
if let Some(config_file) = settings_map.get("config_file").and_then(|v| v.as_str()) {
self.config_file = config_file.to_string();
}
}
if should_reload {
self.load_from_config_file();
}
}
}