config_rw 1.0.0

配置文件读取与写入
Documentation
use config_rw::{init_config, get_arg, set_arg, save_config};
use config_rw::{get_string, get_i64, get_f64, get_bool};
use config_rw::{set_string, set_i64, set_f64, set_bool};

pub mod demo;

use serde_json::Value;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 运行配置管理器示例
    test_config_rw()?;
    demo_cross_module_config()?;
    demo_complex_config()?;
    
    Ok(())
}

fn test_config_rw() -> Result<(), Box<dyn std::error::Error>> {
    // 初始化配置管理器
    init_config("config.toml")?;
    
    println!("=== 配置管理器使用示例 ===\n");
    
    // 读取配置示例
    println!("1. 读取配置示例:");
    
    // 使用 get_arg 获取原始 JSON 值
    let host: Value = get_arg("database.host");
    println!("   数据库主机: {}", host);
    
    // 使用类型化的获取函数
    let port = get_i64("database.port").unwrap_or(3306);
    println!("   数据库端口: {}", port);
    
    let timeout = get_f64("database.timeout").unwrap_or(10.0);
    println!("   数据库超时: {}", timeout);
    
    let debug_enabled = get_bool("app.debug").unwrap_or(false);
    println!("   调试模式: {}", debug_enabled);
    
    let app_name = get_string("app.name").unwrap_or("unknown".to_string());
    println!("   应用名称: {}", app_name);
    
    // 读取嵌套配置
    let cache_enabled = get_bool("app.features.cache_enabled").unwrap_or(false);
    println!("   缓存启用: {}", cache_enabled);
    
    let max_position = get_i64("trading.max_position_size").unwrap_or(0);
    println!("   最大仓位: {}", max_position);
    
    println!("\n2. 修改配置示例:");
    
    // 修改现有配置
    set_string("database.host", "127.0.0.1".to_string())?;
    set_i64("database.port", 3306)?;
    set_bool("app.debug", true)?;
    set_f64("trading.stop_loss_percent", 0.03)?;
    
    println!("   已修改数据库主机为: 127.0.0.1");
    println!("   已修改数据库端口为: 3306");
    println!("   已启用调试模式");
    println!("   已修改止损百分比为: 3%");
    
    // 添加新的配置
    set_string("new_section.new_key", "new_value".to_string())?;
    set_i64("performance.max_threads", 8)?;
    
    println!("   已添加新配置: new_section.new_key = new_value");
    println!("   已添加性能配置: performance.max_threads = 8");
    
    println!("\n3. 验证修改:");
    
    // 验证修改是否生效
    let new_host = get_string("database.host").unwrap();
    println!("   新的数据库主机: {}", new_host);
    
    let new_port = get_i64("database.port").unwrap();
    println!("   新的数据库端口: {}", new_port);
    
    let debug_mode = get_bool("app.debug").unwrap();
    println!("   调试模式: {}", debug_mode);
    
    let new_config = get_string("new_section.new_key").unwrap();
    println!("   新添加的配置: {}", new_config);
    
    println!("\n4. 保存配置:");
    
    // 保存配置到文件
    save_config()?;
    println!("   配置已保存到文件,注释和格式得到保留");
    
    println!("\n=== 示例完成 ===");
    
    Ok(())
}

/// 演示如何在不同模块间共享配置
pub fn demo_cross_module_config() -> Result<(), Box<dyn std::error::Error>> {
    println!("\n=== 跨模块配置访问示例 ===");
    
    // 在任何模块中都可以直接使用配置
    let server_port = get_i64("network.server_port").unwrap_or(8080);
    println!("服务器端口: {}", server_port);
    
    let log_level = get_string("logging.level").unwrap_or("info".to_string());
    println!("日志级别: {}", log_level);
    
    // 动态修改配置
    set_i64("network.server_port", 9090)?;
    set_string("logging.level", "debug".to_string())?;
    
    println!("已修改服务器端口为: 9090");
    println!("已修改日志级别为: debug");
    
    // 验证修改
    let new_port = get_i64("network.server_port").unwrap();
    let new_level = get_string("logging.level").unwrap();
    println!("新的服务器端口: {}", new_port);
    println!("新的日志级别: {}", new_level);
    
    Ok(())
}

/// 演示复杂数据类型的配置
pub fn demo_complex_config() -> Result<(), Box<dyn std::error::Error>> {
    println!("\n=== 复杂配置示例 ===");
    
    // 设置数组配置
    let array_value = Value::Array(vec![
        Value::String("item1".to_string()),
        Value::String("item2".to_string()),
        Value::Number(serde_json::Number::from(42)),
    ]);
    set_arg("complex.array", array_value)?;
    
    // 设置对象配置
    let mut obj = serde_json::Map::new();
    obj.insert("key1".to_string(), Value::String("value1".to_string()));
    obj.insert("key2".to_string(), Value::Number(serde_json::Number::from(123)));
    obj.insert("key3".to_string(), Value::Bool(true));
    set_arg("complex.object", Value::Object(obj))?;
    
    // 读取复杂配置
    let array_config = get_arg("complex.array");
    println!("数组配置: {}", array_config);
    
    let object_config = get_arg("complex.object");
    println!("对象配置: {}", object_config);
    
    save_config()?;
    println!("复杂配置已保存");
    
    Ok(())
}