当前位置:网站首页>文盘Rust -- 配置文件解析
文盘Rust -- 配置文件解析
2022-08-04 13:41:00 【京东云开发者】
处理配置文件是应用开发的常规操作。成熟的开发语言都有自己处理配置文件的套路。golang 有 viper 这样的成熟第三方库来处理配置文件。rust 的第三方库并不成熟。
这篇文章我们来聊聊 rust 如何处理配置文件。
处理yaml配置文件的流程
配置文件的作用是一系列应用程序相应功能的开关。在应用启动前配置,应用启动时加载,以备运行时使用。
我们依旧用[interactcli-rs](https://github.com/jiashiwen/interactcli-rs) 为例,说明一下配置文件的处理过程。
解析配置文件的主要逻辑在 src/configure 目录。
定义 config 结构体
首先,定义一个结构体用来承载配置项。由于 Config struct 需要与 yaml 文件交互,我们定义一个具备序列化与反序列化能力的结构体
```rust#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)]pub struct Config {pub server: String,pub token: String,}```
为 Config 结构体定义必要的功能
```rustimpl Config {pub fn default() -> Self {Self {server: "http://127.0.0.1:8080".to_string(),token: "".to_string(),}}pub fn set_self(&mut self, config: Config) {self.server = config.server;self.token = config.token;}pub fn get_config_image(&self) -> Self {self.clone()}pub fn flush_to_file(&self, path: String) -> Result<()> {let yml = serde_yaml::to_string(&self)?;fs::write(path, yml)?;Ok(())}}```
利用 lazy_static 初始化配置项单例
```rustlazy_static::lazy_static! {static ref GLOBAL_CONFIG: Mutex<Config> = {let global_config = Config::default();Mutex::new(global_config)};static ref CONFIG_FILE_PATH: RwLock<String> = RwLock::new({let path = "".to_string();path});}```
加载配置文件
[interactcli-rs](https://github.com/jiashiwen/interactcli-rs) 是一个命令行程序。加载配置文件的策略为:当指定配置文件位置时,则按给定路径加载配置;如果未指定配置文件则按照默认路径加载,此时若默认配置文件不存在则终止程序。
src/cmd/rootcmd.rs 中的 cmd_match 函数包含上面的逻辑。
```rustfn cmd_match(matches: &ArgMatches) {if let Some(c) = matches.value_of("config") {set_config_file_path(c.to_string());set_config_from_file(&get_config_file_path());} else {set_config_from_file("");}......```
后记
手工处理配置文件还是比较繁琐。尤其在配置文件的书写上,必须明确配置每一个配置项,即使配置项为空也需填写。为了保证配置文件的配置项齐全,我们为Config struct 定义了 flush_to_file 函数,用来生成配置问题。
由于 rust 的生态较 golang 已经 java 的生态还很年轻,第三方的工具包不及两者完善。在配置文件的处理上比较繁琐,很多地方需要手工处理,但是已基本满足要求。
咱们下期见。
作者:贾世闻
边栏推荐
猜你喜欢

烂大街的缓存穿透、缓存击穿和缓存雪崩,你真的懂了?

MFC的相机双目标定界面设计

Niuke.com Brush Question Record || Linked List
![[Niu Ke brush questions-SQL big factory interview questions] NO5. Analysis of a treasure store (e-commerce model)](/img/9f/33e782b93fcaa15359450e59a7233d.png)
[Niu Ke brush questions-SQL big factory interview questions] NO5. Analysis of a treasure store (e-commerce model)

redis未授权访问漏洞【vulhub靶场】复现

汉诺塔怎么玩

谁说 Mysql 单表最大 2000 W ?我硬要塞它 1 个亿

Haproxy搭建web群集

《社会企业开展应聘文职人员培训规范》团体标准在新华书店上架

【牛客刷题-SQL大厂面试真题】NO5.某宝店铺分析(电商模式)
随机推荐
【LeetCode】1403. 非递增顺序的最小子序列
Button control switch 4017 digital circuit chip
SMART S7-200PLC串行自由口通讯(耐压测试仪)
七夕当然要学会SQL优化好早点下班去找对象
Convolutional Neural Network Basics
js正则表达式提取内容
石子 无限拿
LeetCode 1403 Minimum subsequence in non-increasing order [greedy] HERODING's LeetCode road
备份控制文件
从零开始配置 vim(7)——自动命令
Install mysql on k8s
卷积神经网络 基础
人像分割技术解析与应用
AutoCAD DWG,DXF文件导出高清图片、PDF
[UML] Summary of Information System Analysis and Design Knowledge Points
vcl啥意思_oval
Utility function---string processing
How to stress the MySQL performance indicators TPS\QPS\IOPS?
干掉visio,这个画图神器真的绝了
座舱人机交互「暗潮汹涌」,语音「下」,多模态「上」