config 模块完成

Signed-off-by: Jia Chao <jiac13@chinaunicom.cn>
This commit is contained in:
Jia Chao 2024-07-11 15:16:13 +08:00
parent 6130cfb724
commit 6020ca43ba

View File

@ -0,0 +1,141 @@
use std::collections::HashMap;
use std::fs;
use std::io::Write;
use serde::{Deserialize, Serialize};
/// Config 结构体包含一个 HashMap其中键是 String 类型,值是 WebSycnConf 类型。
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub(crate) struct Config {
pub inner: HashMap<String, WebSycnConf>,
}
#[allow(dead_code)]
impl Config {
/// 创建一个新的 Config 实例。
///
/// # 返回值
/// 返回一个包含空 HashMap 的 Config 实例。
pub fn new() -> Self {
Self {
inner: HashMap::new(),
}
}
/// 从指定路径加载配置文件。
///
/// 该方法尝试从给定路径读取文件,并解析 TOML 格式的数据。
///
/// # 参数
/// - `path`: 配置文件的路径。
///
/// # 返回值
/// 返回一个 `Result`,成功时包含 `Config` 实例,失败时包含错误信息。
pub fn load(path: &str) -> crate::Result<Self> {
// 读取文件内容
let data = std::fs::read_to_string(path)?;
// 解析 TOML 数据
match toml::from_str::<Config>(&data) {
Ok(config) => Ok(config),
Err(e) => Err(Box::new(e)),
}
}
/// 将当前配置保存到指定路径。
///
/// 该方法将当前配置序列化为 TOML 格式,并写入到指定路径的文件中。
///
/// # 参数
/// - `path`: 配置文件的保存路径。
///
/// # 返回值
/// 返回一个 `Result`,成功时返回 `Ok(())`,失败时返回错误信息。
pub fn save(&self, path: &str) -> crate::Result<()> {
// 将配置序列化为 TOML 格式的字符串
let data = toml::to_string_pretty(&self)?;
// 打开文件并写入数据
let mut config = fs::OpenOptions::new()
.read(true)
.write(true)
.create(true)
.open(path)?;
config.write_all(data.as_bytes())?;
config.flush()?;
Ok(())
}
}
/// WebSycnConf 结构体表示一个同步配置,包括源路径和目标路径。
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub(crate) struct WebSycnConf {
/// 源路径
from: String,
/// 目标路径
dest: String,
}
#[allow(dead_code)]
impl WebSycnConf {
/// 创建一个新的 WebSycnConf 实例。
///
/// # 参数
/// - `from`: 源路径
/// - `dest`: 目标路径
///
/// # 返回值
/// 返回一个新的 WebSycnConf 实例。
pub fn new(from: String, dest: String) -> Self {
WebSycnConf { from, dest }
}
/// 获取源路径。
///
/// # 返回值
/// 返回源路径的引用。
pub fn from(&self) -> &str {
&self.from
}
/// 获取目标路径。
///
/// # 返回值
/// 返回目标路径的引用。
pub fn dest(&self) -> &str {
&self.dest
}
}
#[test]
fn config_test() {
let cvrfsyncer = WebSycnConf::new(
"http://mirrors.ustc.edu.cn/openeuler/security/data/cvrf/".to_string(),
"./test/cvrfs".to_string(),
);
let srpmsyncer = WebSycnConf::new(
"http://mirrors.ustc.edu.cn/culinux/3.0/source/".to_string(),
"./test/srpms".to_string(),
);
let mut config = Config::new();
config.inner.insert("cvrf".to_string(), cvrfsyncer);
config.inner.insert("srpms".to_string(), srpmsyncer);
let conf_file = "./test/cuwebsyncer.toml";
// 首先测试写入配置文件
match config.save(conf_file) {
Ok(()) => assert!(true),
Err(e) => assert_eq!("", format!("{e}")),
}
// 再测试读取
let new_config = Config::load(conf_file).unwrap();
// 两个结果相等
assert_eq!(config, new_config);
// 删除测试用文件
std::fs::remove_file(conf_file).unwrap();
}