use syn::{Attribute, Meta};
#[derive(Debug, Default, Clone)]
pub struct ExposeConfig {
pub create: bool,
pub update: bool,
pub response: bool,
pub skip: bool
}
impl ExposeConfig {
pub fn from_attr(attr: &Attribute) -> Self {
let mut config = Self::default();
if let Meta::List(meta_list) = &attr.meta {
let _ = meta_list.parse_nested_meta(|meta| {
if meta.path.is_ident("create") {
config.create = true;
} else if meta.path.is_ident("update") {
config.update = true;
} else if meta.path.is_ident("response") {
config.response = true;
} else if meta.path.is_ident("skip") {
config.skip = true;
}
Ok(())
});
}
config
}
#[must_use]
pub fn in_create(&self) -> bool {
!self.skip && self.create
}
#[must_use]
pub fn in_update(&self) -> bool {
!self.skip && self.update
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_is_all_false() {
let config = ExposeConfig::default();
assert!(!config.create);
assert!(!config.update);
assert!(!config.response);
assert!(!config.skip);
}
#[test]
fn skip_overrides_all() {
let config = ExposeConfig {
create: true,
update: true,
response: true,
skip: true
};
assert!(!config.in_create());
assert!(!config.in_update());
assert!(config.skip);
}
}