Crates.io | isx |
lib.rs | isx |
version | 0.1.1 |
source | src |
created_at | 2024-07-02 12:09:25.852487 |
updated_at | 2024-07-02 12:17:47.095319 |
description | Traits for checking certain conditions of values |
homepage | |
repository | https://github.com/ctron/is-x |
max_upload_size | |
id | 1289540 |
size | 7,111 |
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
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());
}
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,
}
IsDefault
IsEmpty