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>
whereT: 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);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/780875.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

登录者个人信息查询

目录 &#x1f95e;1.vo层描述 &#x1f37f;2..vo层创建 &#x1f32d;3.编写controller层 &#x1f953;4.service层 &#x1f9c2;5.测试 1.vo层描述 Spring Boot项目中的实体类通常用于映射数据库表&#xff0c;包含了业务对象的所有属性。然而&#xff0c;前端或其…

Jenkins详细安装配置部署

目录 简介一、安装jdk二、安装jenkins这里如果熟悉 Jenkins &#xff0c;可以【选择插件来安装】&#xff0c;如果不熟悉&#xff0c;还是按照推荐来吧。注意&#xff1a; 三、插件安装如果上面插件安装&#xff0c;选择的不是【安装推荐的插件】&#xff0c;而是【选择插件来安…

ZYNQ学习之PetaLinux与Vitis的安装

基本都是摘抄正点原子的文章&#xff1a;<领航者 ZYNQ 之嵌入式Linux 开发指南 V3.2.pdf&#xff0c;因初次学习&#xff0c;仅作学习摘录之用&#xff0c;有不懂之处后续会继续更新~ 一、Petalinux安装 1.1、Petalinux资源下载 百度云安装包&#xff1a; Petalinux 安装…

FFMPEG C++封装(一)(C++ FFMPEG)

1 概述 FFMPEG是一个C语言开源视音频编解码库。本文将FFMPG4.1.3进行C封装&#xff0c;形成C FFMPG库。 2 架构 架构图如下所示&#xff1a; 架构说明: Init 初始化FFMPEG库。IStream 输入流&#xff0c;FFMPEG的输入音视频文件。Packet 音视频数据包Decoder 音视频编码器F…

C语言运算符和表达式——强制类型转换

目录 自动类型转换 强制类型转换运算符——类型强转&#xff08;Casting&#xff09; 问题的提出 Example: int total, number; float aver; …… 整数除法&#xff1a; aver total / number; total:15 →15/2 …

R语言数据分析基础(三)

在R语言中&#xff0c;数据类型主要包括以下几种&#xff1a; 数值型&#xff08;Numeric&#xff09;: 数值型数据包括整数&#xff08;integer&#xff09;和双精度数&#xff08;double&#xff09;。整数是没有小数部分的数字&#xff0c;而双精度数可以有小数部分。在R中&…

大模型日报2024-03-29

大模型资讯 Databricks推出开源大型语言模型DBRX&#xff0c;与Llama 2、Mixtral和GPT-3.5竞争 摘要: Databricks近日推出了一款开源的大型语言模型DBRX&#xff0c;旨在与现有的Llama 2、Mixtral和GPT-3.5展开竞争。DBRX模型将使企业能够掌控自己的生成式AI工具开发&#xff0…

每日OJ题_子序列dp④_力扣646. 最长数对链

目录 力扣646. 最长数对链 解析代码 力扣646. 最长数对链 646. 最长数对链 难度 中等 给你一个由 n 个数对组成的数对数组 pairs &#xff0c;其中 pairs[i] [lefti, righti] 且 lefti < righti 。 现在&#xff0c;我们定义一种 跟随 关系&#xff0c;当且仅当 b &l…

Java | 阶乘和计算

大家可以关注一下专栏&#xff0c;方便大家需要的时候直接查找&#xff0c;专栏将持续更新~ 题目描述 编写一个Java程序&#xff0c;用于计算12!3!…20!的和。其中&#xff0c;n!表示n的阶乘&#xff0c;即从1乘到n。 程序需要输出12!3!…20!的和。 解题思路 初始化变…

OpenHarmony:RichEditor组件样例开发

使用 richEditor 组件实现一个富文本编辑框&#xff0c;包含富文本编辑区域和功能栏&#xff0c;功能栏中有多个按键&#xff0c;可以调整字体大小、字体样式、字体颜色、布局&#xff0c;并可以插入图片。 api 版本&#xff1a;api11 主页面 import { TitleBar } from ../.…

element跑马灯/轮播图,第一页隐藏左边按钮,最后一页隐藏右边按钮(vue 开箱即用)

图示&#xff1a; 第一步&#xff1a; <el-carousel :class"changeIndex0?leftBtnNone:changeIndeximgDataList.length-1? rightBtnNone:" height"546px" :autoplay"false" change"changeNext"><el-carousel-item v-for…

Stata 15 for Mac:数据统计分析新标杆,让研究更高效!

Stata 是一种统计分析软件&#xff0c;适用于数据管理、数据分析和绘图。Stata 15 for Mac 具有以下功能&#xff1a; 数据管理&#xff1a;Stata 提供强大的数据管理功能&#xff0c;用户可以轻松导入、清洗、整理和管理数据集。 统计分析&#xff1a;Stata 提供了广泛的统计…

A Little Is Enough: Circumventing Defenses For Distributed Learning

联邦学习的攻击方法&#xff1a;LIE 简单的总结&#xff0c;只是为了能快速想起来这个方法。 无目标攻击 例如总共50个客户端&#xff0c;有24个恶意客户端&#xff0c;那么这个时候&#xff0c;他需要拉拢2个良性客户端 计算 50 − 24 − 2 50 − 24 0.923 \frac{50-24-2}{…

瑞_23种设计模式_中介者模式

文章目录 1 中介者模式&#xff08;Mediator Pattern&#xff09;1.1 介绍1.2 概述1.3 中介者模式的结构1.4 中介者模式的优缺点1.5 中介者模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 &#x1f64a; 前言&#xff1a;本文章为瑞_系列专栏之《2…

Java项目:80 springboot师生健康信息管理系统

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 系统的角色&#xff1a;管理员、宿管、学生 管理员管理宿管员&#xff0c;管理学生&#xff0c;修改密码&#xff0c;维护个人信息。 宿管员…

数组类模板(类模拟实现静态数组)

目录 介绍&#xff1a; 案例描述&#xff1a; 思路&#xff1a; 对要求分别分析实现&#xff1a; 创建对应的类&#xff1a; 1.定义一个数组类 2.类中属性有&#xff1a;数组&#xff0c; 容量&#xff0c; 大小 3.数组函数有&#xff1a; 构造函数&#xff08;容量&am…

C++数塔问题

#include <iostream> #include <vector>using namespace std;int main() {// 读取输入int n;cin >> n;vector<vector<int>> tower(n, vector<int>(n));for (int i 0; i < n; i) {for (int j 0; j < i; j) {cin >> tower[i][…

排序---数组和集合

1、数组排序 Arrays.sort(int[] a)这种形式是对一个数组的所有元素进行排序&#xff0c;并且是按照从小到大的排序。 public static void main(String[] args) {Integer []arr {1,2,3,4,5,6};//升序Arrays.sort(arr);for (int x:arr){System.out.print(x " ");}Sys…

Maven:构建现代化软件项目的强大工具

在软件开发的世界中&#xff0c;Maven 是一个备受欢迎的构建工具。它提供了一种标准化、自动化的方式来管理项目的依赖、构建过程和部署。本文将深入探讨 Maven 的各个方面&#xff0c;帮助您更好地理解和使用这一强大的工具。 一、Maven 的简介 Maven 是一个基于项目…

axios请求类型是文件流怎么显示报错信息

axios请求类型是文件流&#xff0c;但是报错信息的话没法显示&#xff0c;在request.js文件中更改一下request拦截器代码&#xff1a; service.interceptors.request.use(config > { ...... , error > { console.log(error, 报错报错) // 处理请求错误 if (error.respons…