isx

Crates.ioisx
lib.rsisx
version0.1.1
sourcesrc
created_at2024-07-02 12:09:25.852487
updated_at2024-07-02 12:17:47.095319
descriptionTraits for checking certain conditions of values
homepage
repositoryhttps://github.com/ctron/is-x
max_upload_size
id1289540
size7,111
Jens Reimann (ctron)

documentation

README

is-x

Traits for checking certain conditions of values: is empty? is default?

Also see: https://internals.rust-lang.org/t/traits-for-is-empty-and-or-is-default/21114

Examples

For the IsDefault trait:

use isx::prelude::*;

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

For the IsEmpty trait:

use isx::prelude::*;

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

Why?

Because in same cases, it would be great to have a common pattern:


#[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,
}

Having that in std or core, might actually convince people to go for this:

#[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,
}

ToDo

  • Implement a derive for IsDefault
  • Implement a derive for IsEmpty
Commit count: 0

cargo fmt