You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 00:13:13