use serde::Serialize;
use crate::projection::ProjectionValueType;
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize)]
pub struct MutationModelIdentity {
pub model: String,
pub storage: String,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize)]
pub struct MutationKeyCapability {
pub name: String,
pub value_type: ProjectionValueType,
pub ordinal: u32,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize)]
pub struct MutationFieldCapability {
pub name: String,
pub value_type: ProjectionValueType,
pub nullable: bool,
pub supports_unset: bool,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize)]
pub struct MutationRelationshipCapability {
pub name: String,
pub source_model: String,
pub target_model: String,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize)]
pub struct ReadModelMutationCapabilities {
pub identity: MutationModelIdentity,
pub key: Vec<MutationKeyCapability>,
pub fields: Vec<MutationFieldCapability>,
pub relationships: Vec<MutationRelationshipCapability>,
pub returning: Vec<String>,
}
impl ReadModelMutationCapabilities {
pub fn new(
model: impl Into<String>,
storage: impl Into<String>,
key: Vec<MutationKeyCapability>,
fields: Vec<MutationFieldCapability>,
relationships: Vec<MutationRelationshipCapability>,
) -> Self {
let returning = fields.iter().map(|field| field.name.clone()).collect();
Self {
identity: MutationModelIdentity {
model: model.into(),
storage: storage.into(),
},
key,
fields,
relationships,
returning,
}
}
pub fn is_key_field(&self, name: &str) -> bool {
self.key.iter().any(|field| field.name == name)
}
pub fn field(&self, name: &str) -> Option<&MutationFieldCapability> {
self.fields.iter().find(|field| field.name == name)
}
}