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);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值