Crate is_empty

source ·
Expand description

Easily check if the struct is empty.

Say you have a struct full of Option<T> fields, and you want to know if all the fields are None.

struct Foo {
    client_ip: Option<String>,
    client_country: Option<String>,
}

You can manually check for each field like this:

impl Foo {
    fn is_empty(&self) -> bool {
       self.client_ip.is_none() && self.client_country.is_none()
    }
}

But this becomes tedious as more and more fields are added to the struct.

With this crate, you can derive the IsEmpty trait, and then call is_empty() on the struct.

use is_empty::IsEmpty;

#[derive(IsEmpty)]
struct Foo {
    client_ip: Option<String>,
    client_country: Option<String>,
}

let empty_foo = Foo { client_ip: None, client_country: None };
assert!(empty_foo.is_empty());

You can also nest other IsEmpty-deriving struct inside the struct.

use is_empty::IsEmpty;

#[derive(IsEmpty)]
struct Foo {
    bar: Bar,
    baz: Option<u8>
}
#[derive(IsEmpty)]
struct Bar {
    client_ip: Option<String>,
    client_country: Option<String>,
}

let empty_foo = Foo { bar: Bar { client_ip: None, client_country: None }, baz: None };
assert!(empty_foo.is_empty());

If you want to customize the logic for determining if the field is empty, you can use the #[is_empty(if = "some_fn")] attribute.

use is_empty::IsEmpty;

#[derive(IsEmpty)]
struct Foo {
    #[is_empty(if = "Vec::is_empty")]
    bar: Vec<u8>,
}

let empty_foo = Foo { bar: vec![] };
assert!(empty_foo.is_empty());

This crate pairs well with serde’s #[serde(skip_serializing_if = "condition")] attribute.

use is_empty::IsEmpty;
use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize, IsEmpty)]
struct Foo {
    client_ip: Option<String>,
    client_country: Option<String>,
}

#[derive(Serialize, Deserialize)]
struct Root {
    #[serde(skip_serializing_if = "is_empty::is_empty")]
    foo: Foo,
}

let empty_foo = Foo { client_ip: None, client_country: None };
let root = Root { foo: empty_foo };
assert_eq!(serde_json::to_string(&root).unwrap(), "{}");

Traits

A trait for checking if a struct is empty. See the crate-level documentation for more information.

Functions

Thin wrapper function around IsEmpty::is_empty. Use it with serde’s skip_serializing_if attribute.
Check if the Option<T> is really empty.

Derive Macros