use std::collections::HashMap;
use crate::schema::CompiledSchema;
#[derive(Debug, Clone)]
pub struct CascadeMetadata {
mutation_entity_map: HashMap<String, String>,
entity_mutations_map: HashMap<String, Vec<String>>,
}
impl CascadeMetadata {
#[must_use]
pub fn new() -> Self {
Self {
mutation_entity_map: HashMap::new(),
entity_mutations_map: HashMap::new(),
}
}
pub fn add_mutation(&mut self, mutation_name: &str, entity_type: &str) {
let mutation_name = mutation_name.to_string();
let entity_type = entity_type.to_string();
self.mutation_entity_map.insert(mutation_name.clone(), entity_type.clone());
self.entity_mutations_map.entry(entity_type).or_default().push(mutation_name);
}
#[must_use]
pub fn get_entity_type(&self, mutation_name: &str) -> Option<&str> {
self.mutation_entity_map.get(mutation_name).map(|s| s.as_str())
}
#[must_use]
pub fn get_mutations_for_entity(&self, entity_type: &str) -> Vec<String> {
self.entity_mutations_map.get(entity_type).cloned().unwrap_or_default()
}
#[must_use]
pub fn count(&self) -> usize {
self.mutation_entity_map.len()
}
#[must_use]
pub fn contains_mutation(&self, mutation_name: &str) -> bool {
self.mutation_entity_map.contains_key(mutation_name)
}
#[must_use]
pub fn from_schema(schema: &CompiledSchema) -> Self {
let mut metadata = Self::new();
for mutation in &schema.mutations {
metadata.add_mutation(&mutation.name, &mutation.return_type);
}
metadata
}
}
impl Default for CascadeMetadata {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_build_from_mutations() {
let mut metadata = CascadeMetadata::new();
metadata.add_mutation("createUser", "User");
metadata.add_mutation("updateUser", "User");
metadata.add_mutation("deleteUser", "User");
assert_eq!(metadata.count(), 3);
}
#[test]
fn test_map_mutation_to_entity_type() {
let mut metadata = CascadeMetadata::new();
metadata.add_mutation("createUser", "User");
metadata.add_mutation("createPost", "Post");
assert_eq!(metadata.get_entity_type("createUser"), Some("User"));
assert_eq!(metadata.get_entity_type("createPost"), Some("Post"));
}
#[test]
fn test_handle_unknown_mutation() {
let metadata = CascadeMetadata::new();
assert_eq!(metadata.get_entity_type("unknownMutation"), None);
}
#[test]
fn test_multiple_mutations_same_entity() {
let mut metadata = CascadeMetadata::new();
metadata.add_mutation("createUser", "User");
metadata.add_mutation("updateUser", "User");
metadata.add_mutation("deleteUser", "User");
let mutations = metadata.get_mutations_for_entity("User");
assert_eq!(mutations.len(), 3);
assert!(mutations.contains(&"createUser".to_string()));
assert!(mutations.contains(&"updateUser".to_string()));
assert!(mutations.contains(&"deleteUser".to_string()));
}
#[test]
fn test_contains_mutation() {
let mut metadata = CascadeMetadata::new();
metadata.add_mutation("createUser", "User");
assert!(metadata.contains_mutation("createUser"));
assert!(!metadata.contains_mutation("unknownMutation"));
}
}