#[derive(Debug, Clone)]
#[non_exhaustive]
pub enum InvalidationReason {
Mutation {
mutation_name: String,
},
Manual {
reason: String,
},
SchemaChange {
old_version: String,
new_version: String,
},
}
impl InvalidationReason {
#[must_use]
pub fn to_log_string(&self) -> String {
match self {
Self::Mutation { mutation_name } => format!("mutation:{mutation_name}"),
Self::Manual { reason } => format!("manual:{reason}"),
Self::SchemaChange {
old_version,
new_version,
} => {
format!("schema_change:{old_version}->{new_version}")
},
}
}
}
#[derive(Debug, Clone)]
pub struct InvalidationContext {
pub modified_views: Vec<String>,
pub reason: InvalidationReason,
}
impl InvalidationContext {
#[must_use]
pub fn for_mutation(mutation_name: &str, modified_views: Vec<String>) -> Self {
Self {
modified_views,
reason: InvalidationReason::Mutation {
mutation_name: mutation_name.to_string(),
},
}
}
#[must_use]
pub fn manual(modified_views: Vec<String>, reason: &str) -> Self {
Self {
modified_views,
reason: InvalidationReason::Manual {
reason: reason.to_string(),
},
}
}
#[must_use]
pub fn schema_change(
affected_views: Vec<String>,
old_version: &str,
new_version: &str,
) -> Self {
Self {
modified_views: affected_views,
reason: InvalidationReason::SchemaChange {
old_version: old_version.to_string(),
new_version: new_version.to_string(),
},
}
}
#[must_use]
pub fn to_log_string(&self) -> String {
format!(
"{} affecting {} view(s)",
self.reason.to_log_string(),
self.modified_views.len()
)
}
#[must_use]
pub const fn view_count(&self) -> usize {
self.modified_views.len()
}
#[must_use]
pub fn affects_view(&self, view: &str) -> bool {
self.modified_views.iter().any(|v| v == view)
}
}