rust - 使用serde_yaml读取配置文件

本文提供了一种读取yaml配置文件,转换为结构体的方法。

安装依赖

cargo add serde
cargo add serde_json
cargo add serde_yaml
cargo add schemars

配置文件示例

test:
  debug: true

设置需要转换的结构体

需要定义Default trait,用于配置文件不存在的情况下所需要的默认配置值。

use schemars::schema::RootSchema;
use serde::de::DeserializeOwned;
use serde::{Deserialize, Serialize};
use std::env;
use std::path::PathBuf;

#[derive(Debug, Serialize, Deserialize)]
struct TestConf {
    debug: bool,
}

impl Default for TestConf {
    fn default() -> Self {
        Self { debug: false }
    }
}

#[derive(Debug, Serialize, Deserialize)]
struct GlobalConf {
    test: TestConf,
}

impl Default for GlobalConf {
    fn default() -> Self {
        Self { test: TestConf::default() }
    }
}

读取配置文件

根据指定的文件路径读取yaml格式的文件,将其转换为结构体对象。

/// 读取yaml配置文件
fn load_yaml_config<T>(path: &str) -> Option<T>
where
    T: DeserializeOwned,
{
    // 将yaml解析为json对象
    match serde_yaml::from_str::<RootSchema>(
        &std::fs::read_to_string(path)
            .expect(&format!("failure read config file {}", path)),
    ) {
        Ok(root_schema) => {
            // 将json对象转换指定的结构体实例
            let data = serde_json::to_string_pretty(&root_schema)
                .expect("failure to parse RootSchema");
            let config = serde_json::from_str::<T>(&*data)
                .expect(&format!("failure to read yaml file"));

            Some(config)
        }
        Err(_err) => None,
    }
}

/// 读取并加载配置文件
fn fetch_conf(path: Option<PathBuf>) -> GlobalConf {
    match path {
        Some(path) => {
            // 从指定的文件路径加载配置
            load_yaml_config::<GlobalConf>(path.to_str().unwrap()).unwrap()
        }
        None => {
            // 配置文件不存在,则使用默认配置
            GlobalConf::default()
        }
    }
}

单元测试

#[test]
fn test_read_yaml_conf() {
    let config_path = env::current_dir().unwrap().join("tests/data.yaml");
    let global_conf = fetch_conf(Some(config_path));
    assert_eq!(global_conf.test.debug, true);
}
serde_json是Rust语言中一个用于序列化和反序列化JSON数据的库。它提供了一组简单易用的API,可以将Rust结构体或其他数据类型转换为JSON格式,并将其写入到文件中。 要使用serde_json库进行JSON写入,首先需要在Cargo.toml文件中添加serde_json依赖项。可以通过以下方式添加: ```toml [dependencies] serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" ``` 接下来,在Rust代码中导入所需的模块: ```rust use serde::{Serialize, Deserialize}; use serde_json::{Result, Value}; use std::fs::File; use std::io::prelude::*; ``` 然后,定义一个结构体或其他数据类型,并实现Serialize trait以支持序列化为JSON。例如,我们定义一个名为Person的结构体: ```rust #[derive(Serialize, Deserialize)] struct Person { name: String, age: u32, address: String, } ``` 接下来,可以创建一个Person对象,并将其序列化为JSON字符串: ```rust fn main() -> Result<()> { let person = Person { name: "John".to_string(), age: 30, address: "123 Street".to_string(), }; let json_string = serde_json::to_string(&person)?; // 将JSON字符串写入文件 let mut file = File::create("person.json")?; file.write_all(json_string.as_bytes())?; Ok(()) } ``` 在上述示例中,我们使用serde_json的to_string函数将Person对象序列化为JSON字符串。然后,我们创建一个文件并将JSON字符串写入该文件。 需要注意的是,上述示例中的代码可能会返回Result类型,因此需要处理潜在的错误。可以使用?运算符来简化错误处理。 希望以上信息对你有所帮助!如果你有任何其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值