use serde::{Serialize, de::DeserializeOwned};
pub trait Entity: Serialize + DeserializeOwned {
fn entity_type() -> &'static str;
fn natural_key(&self) -> String;
fn storage_key(&self) -> String {
format!("{}/{}", Self::entity_type(), self.natural_key())
}
}
pub struct EntitySchema {
pub entity_type: &'static str,
pub references: Vec<(&'static str, &'static str)>,
}
#[cfg(test)]
mod tests {
use super::*;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize)]
struct TestProject {
name: String,
}
impl Entity for TestProject {
fn entity_type() -> &'static str {
"project"
}
fn natural_key(&self) -> String {
self.name.to_lowercase()
}
}
#[test]
fn storage_key_combines_type_and_natural_key() {
let p = TestProject {
name: "Website".into(),
};
assert_eq!(p.storage_key(), "project/website");
}
#[test]
fn natural_key_is_lowercase() {
let p = TestProject {
name: "My BLOG".into(),
};
assert_eq!(p.natural_key(), "my blog");
assert_eq!(p.storage_key(), "project/my blog");
}
}