pub(crate) mod in_memory;
mod metadata;
mod schema;
mod session;
use serde::{de::DeserializeOwned, Serialize};
use std::fmt;
pub trait ReadModel: Serialize + DeserializeOwned + Clone + Send + Sync {
const COLLECTION: &'static str;
fn id(&self) -> &str;
}
#[derive(Debug, Clone, PartialEq)]
pub struct Versioned<T> {
pub data: T,
pub version: u64,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum ReadModelError {
ConcurrencyConflict {
collection: String,
id: String,
expected: u64,
actual: u64,
},
Serde(String),
Storage(String),
NotFound { collection: String, id: String },
Lock(crate::lock::LockError),
Metadata(String),
}
impl fmt::Display for ReadModelError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ReadModelError::ConcurrencyConflict {
collection,
id,
expected,
actual,
} => write!(
f,
"concurrency conflict on {}:{} (expected version {}, actual {})",
collection, id, expected, actual
),
ReadModelError::Serde(msg) => write!(f, "read model serialization error: {}", msg),
ReadModelError::Storage(msg) => write!(f, "read model storage error: {}", msg),
ReadModelError::NotFound { collection, id } => {
write!(f, "read model not found: {}:{}", collection, id)
}
ReadModelError::Lock(err) => write!(f, "read model lock error: {}", err),
ReadModelError::Metadata(msg) => write!(f, "read model metadata error: {}", msg),
}
}
}
impl std::error::Error for ReadModelError {}
impl From<crate::lock::LockError> for ReadModelError {
fn from(err: crate::lock::LockError) -> Self {
ReadModelError::Lock(err)
}
}
pub use in_memory::InMemoryReadModelStore;
pub use metadata::{
ColumnDef, ColumnType, ForeignKey, IndexDef, PrimaryKey, ReadModelSchema, RelationalReadModel,
RelationalReadModelIncludes, RelationshipDef, RelationshipKind, RowKey, RowValue, RowValues,
DEFAULT_READ_MODEL_VERSION_COLUMN,
};
pub use schema::{
ReadModelMigrationArtifact, ReadModelSchemaAdapter, ReadModelSchemaAdapterCapabilities,
ReadModelSchemaBootstrap, ReadModelSchemaIssue, ReadModelSchemaIssueKind,
ReadModelSchemaRegistry, ReadModelSchemaVerification,
};
#[cfg(any(feature = "postgres", feature = "sqlite"))]
pub(crate) use session::{column_name_for, key_fingerprint, validate_key, validate_row_values};
pub use session::{
DeleteRowMutation, ExpectedVersion, PatchMode, PatchRowMutation, ReadModelAdapterCapabilities,
ReadModelCommitOutcome, ReadModelIncludeRows, ReadModelLoadBuilder, ReadModelLoadGraph,
ReadModelLoadRequest, ReadModelMutation, ReadModelQueryCapabilities, ReadModelWorkspace,
ReadModelWorkspaceExt, ReadModelWritePlan, ReadModelWritePlanBuilder, RowMutation, RowPatch,
RowWriteMode,
};