如何用Rust结构体与枚举实现配置文件解析,生成不同类型数据存储对象
Rust 基于枚举实现动态配置解析与数据存储对象实例化
依赖准备
首先在Cargo.toml中添加序列化相关依赖:
[dependencies] serde = { version = "1.0", features = ["derive", "yaml"] } serde_yaml = "0.9"
定义基础配置结构体
先实现通用的模型配置,以及各数据源的专属配置结构体:
use serde::Deserialize; use std::fs; #[derive(Debug, Deserialize)] pub struct Model { pub model_path: String, } #[derive(Debug, Deserialize)] pub struct CsvSettings { pub file_path: String, pub delimiter: char, pub headers: bool, } #[derive(Debug, Deserialize)] pub struct JsonSettings { pub file_path: String, pub json_specific_field: bool, }
定义DataStore枚举与自动反序列化
利用serde的tag和content属性,让配置自动匹配对应的数据源类型:
#[derive(Debug, Deserialize)] #[serde(tag = "datastore_type", content = "settings")] pub enum DataStore { Csv(CsvSettings), Json(JsonSettings), // 后续新增数据源只需添加对应变体即可 }
该属性的作用:
- 读取配置中的
datastore_type字段作为枚举标签 - 将
settings字段内容反序列化为标签对应的结构体,自动填充到枚举变体中
实现统一数据加载方法
给DataStore枚举实现通用的load_data方法,内部通过match分支处理不同数据源的逻辑:
impl DataStore { pub fn load_data(&self) -> Vec<Vec<String>> { match self { DataStore::Csv(settings) => { // 替换为实际CSV读取逻辑 println!("加载CSV文件: {},分隔符: '{}'", settings.file_path, settings.delimiter); vec![] } DataStore::Json(settings) => { // 替换为实际JSON读取逻辑 println!("加载JSON文件: {},专属字段值: {}", settings.file_path, settings.json_specific_field); vec![] } } } }
定义主配置结构体与加载逻辑
#[derive(Debug, Deserialize)] pub struct InferenceConfig { pub model: Model, pub datastore: DataStore, } impl InferenceConfig { pub fn new(filepath: &str) -> Result<Self, serde_yaml::Error> { let content = fs::read_to_string(filepath)?; serde_yaml::from_str(&content) } }
使用示例
fn main() -> Result<(), Box<dyn std::error::Error>> { // 加载配置文件 let config = InferenceConfig::new("config.yaml")?; println!("模型路径: {}", config.model.model_path); // 调用统一加载方法 let data = config.datastore.load_data(); println!("加载数据行数: {}", data.len()); Ok(()) }
核心优势
- 类型安全:每个数据源的配置字段严格对应,避免无效或缺失字段的问题
- 扩展性强:新增数据源只需添加对应Settings结构体和枚举变体,补充
load_data分支即可 - 调用简洁:上层代码无需关心具体数据源类型,直接调用统一方法完成数据加载
内容的提问来源于stack exchange,提问作者mtobin
相关产品推荐
相关产品推荐

