use darling::FromMeta;
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub enum ReturningMode {
#[default]
Full,
Id,
None,
Custom(Vec<String>)
}
impl FromMeta for ReturningMode {
fn from_string(value: &str) -> darling::Result<Self> {
match value.to_lowercase().as_str() {
"full" => Ok(ReturningMode::Full),
"id" => Ok(ReturningMode::Id),
"none" => Ok(ReturningMode::None),
_ => {
let columns: Vec<String> = value
.split(',')
.map(|s| s.trim().to_string())
.filter(|s| !s.is_empty())
.collect();
if columns.is_empty() {
Err(darling::Error::unknown_value(value))
} else {
Ok(ReturningMode::Custom(columns))
}
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_is_full() {
assert_eq!(ReturningMode::default(), ReturningMode::Full);
}
#[test]
fn from_meta_keywords() {
assert_eq!(
ReturningMode::from_string("full").unwrap(),
ReturningMode::Full
);
assert_eq!(
ReturningMode::from_string("FULL").unwrap(),
ReturningMode::Full
);
assert_eq!(ReturningMode::from_string("id").unwrap(), ReturningMode::Id);
assert_eq!(ReturningMode::from_string("ID").unwrap(), ReturningMode::Id);
assert_eq!(
ReturningMode::from_string("none").unwrap(),
ReturningMode::None
);
assert_eq!(
ReturningMode::from_string("NONE").unwrap(),
ReturningMode::None
);
}
#[test]
fn from_meta_custom_columns() {
assert_eq!(
ReturningMode::from_string("id, created_at").unwrap(),
ReturningMode::Custom(vec!["id".to_string(), "created_at".to_string()])
);
assert_eq!(
ReturningMode::from_string("id,name,updated_at").unwrap(),
ReturningMode::Custom(vec![
"id".to_string(),
"name".to_string(),
"updated_at".to_string()
])
);
}
#[test]
fn from_meta_invalid() {
assert!(ReturningMode::from_string("").is_err());
}
}