rust 检索Serde中的别名字段的名称

g52tjvyc  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(164)

我有一个yaml,可以有各种各样的关键,这都是一种条件。

checks:
  should_equal_to: 0
  # or should_greater_than
  # or should_less_than
  # etc etc

我知道我可以很容易地加载这些与serde使用别名:

pub struct Check {
    pub name: String,
    pub sql: String,
    pub abort_on_fail: Option<bool>,
    #[serde(alias = "should_equal_to")]
    #[serde(alias = "should_greater_than_or_equal_to")]
    #[serde(alias = "should_less_than_or_equal_to")]
    #[serde(alias = "should_greater_than")]
    #[serde(alias = "should_less_than")]
    #[serde(alias = "count_greater_than")]
    #[serde(alias = "percent_min_threshold")]
    #[serde(alias = "percent_max_threshold")]
    #[serde(alias = "should_be_within_10")]
    pub condition: Option<i32>,
}

这很好,但我希望在条件属于某种类型时实际采取行动。我认为枚举可能适用于此,但不完全确定如何让Serde告诉我原始别名是什么。
这可能吗?

vltsax25

vltsax251#

您可以只使用flatten艾德枚举来代替别名:

use serde::Deserialize;
use std::collections::HashMap;

#[derive(Deserialize, Debug)]
pub struct Check {
    pub abort_on_fail: Option<bool>,
    #[serde(flatten)]
    pub condition: Option<Condition>,
}

#[derive(Deserialize, Debug)]
#[serde(rename_all="snake_case")]
pub enum Condition {
    ShouldEqualTo(i32),
    ShouldGreaterThan(i32),
    // etc
}

相关问题