2 个版本

0.1.1 2024 年 7 月 2 日
0.1.0 2024 年 7 月 2 日

#725数据结构

MIT 许可证

7KB
108

is-x

检查值的特定条件:是否为空?是否为默认值?

也参见:https://internals.rust-lang.org/t/traits-for-is-empty-and-or-is-default/21114

示例

对于 IsDefault 特质

use isx::prelude::*;

fn test () {
    assert!(false.is_default());
    assert!(true.is_not_default());
}

对于 IsEmpty 特质

use isx::prelude::*;

fn test () {
    assert!(vec![].is_empty());
    assert!(None::<()>.is_empty());
}

为什么?

因为在某些情况下,有一个通用模式会更好


#[derive(Default, IsDefault, IsEmpty, serde::Serialize, serde::Deserialize)]
struct MySubData {
    // […]
}

#[derive(Default, serde::Serialize, serde::Deserialize)]
struct MyData {
    #[serde(default, skip_serializing_if = "IsEmpty::is_empty")]
    list: Vec<String>,
    #[serde(default, skip_serializing_if = "IsEmpty::is_empty")]
    map: HashMap<String, String>,
    #[serde(default, skip_serializing_if = "IsEmpty::is_empty")]
    optional: Option<String>,
    
    #[serde(default, skip_serializing_if = "IsDefault::is_default")]
    flag: bool,

    #[serde(default, skip_serializing_if = "IsEmpty::is_empty")]
    sub_data: MySubData,
}

如果它在 stdcore 中,可能会说服人们采用这种做法

#[derive(Default, serde::Serialize, serde::Deserialize)]
struct MyData {
    #[serde(default, skip_serializing_empty)]
    list: Vec<String>,
    #[serde(default, skip_serializing_empty)]
    map: HashMap<String, String>,
    
    #[serde(default, skip_serializing_default)]
    flag: bool,
}

待办事项

  • IsDefault 实现 derive
  • IsEmpty 实现 derive

没有运行时依赖