use crate::{Change, Relation, RelationChange, Row, Value};
use anyhow::Result;
use std::collections::HashMap;
pub trait InPlaceTransform: Send + Sync {
fn transform(
&self,
table: &str,
id: &mut Value,
fields: Option<&mut HashMap<String, Value>>,
) -> Result<()>;
fn transform_row(&self, row: &mut Row) -> Result<()> {
self.transform(&row.table, &mut row.id, Some(&mut row.fields))
}
fn transform_change(&self, change: &mut Change) -> Result<()> {
self.transform(&change.table, &mut change.id, change.fields.as_mut())
}
fn transform_relation(&self, _relation: &mut Relation) -> Result<()> {
Ok(())
}
fn transform_relation_change(&self, _change: &mut RelationChange) -> Result<()> {
Ok(())
}
fn transform_rows_inplace(&self, rows: &mut [Row]) -> Result<()> {
for row in rows {
self.transform_row(row)?;
}
Ok(())
}
fn transform_changes_inplace(&self, changes: &mut [Change]) -> Result<()> {
for change in changes {
self.transform_change(change)?;
}
Ok(())
}
fn transform_relations_inplace(&self, relations: &mut [Relation]) -> Result<()> {
for relation in relations {
self.transform_relation(relation)?;
}
Ok(())
}
fn transform_relation_changes_inplace(&self, changes: &mut [RelationChange]) -> Result<()> {
for change in changes {
self.transform_relation_change(change)?;
}
Ok(())
}
}
#[derive(Debug, Default, Clone, Copy)]
pub struct Passthrough;
impl InPlaceTransform for Passthrough {
fn transform(
&self,
_table: &str,
_id: &mut Value,
_fields: Option<&mut HashMap<String, Value>>,
) -> Result<()> {
Ok(())
}
}