#![warn(
missing_docs,
missing_debug_implementations,
unreachable_pub,
future_incompatible,
rust_2018_idioms,
rust_2021_compatibility
)]
use std::collections::HashSet;
pub trait FieldFilterable<T> {
fn field_filter(o: T, fields: HashSet<String>) -> Self;
}
pub use fieldfilter_derive::FieldFilterable;
#[cfg(test)]
mod tests {
use super::FieldFilterable;
use std::collections::HashSet;
#[test]
fn test_basic() {
struct User {
id: u32,
name: String,
email: String,
}
#[derive(Debug, PartialEq, FieldFilterable)]
#[field_filterable_on(User)]
struct FilteredUser {
id: u32,
name: Option<String>,
email: Option<String>,
}
let user = User {
id: 1,
name: "Allen".to_string(),
email: "allen@example.org".to_string(),
};
let fields = HashSet::from(["email".to_owned()]);
let filtered_user = FieldFilterable::field_filter(user, fields);
assert_eq!(
FilteredUser {
id: 1,
name: None,
email: Some("allen@example.org".to_string())
},
filtered_user
);
}
#[test]
fn test_optional_base() {
struct User {
id: u32,
name: String,
email: String,
status: Option<String>,
}
#[derive(Debug, PartialEq, FieldFilterable)]
#[field_filterable_on(User)]
struct FilteredUser {
id: u32,
name: Option<String>,
email: Option<String>,
status: Option<Option<String>>,
}
let user = User {
id: 1,
name: "Allen".to_string(),
email: "allen@example.org".to_string(),
status: None,
};
let fields = HashSet::from(["email".to_owned()]);
let filtered_user = FieldFilterable::field_filter(user, fields);
assert_eq!(
FilteredUser {
id: 1,
name: None,
email: Some("allen@example.org".to_string()),
status: None,
},
filtered_user
);
}
}