use panproto_gat::SiteRename;
use panproto_mig::Migration;
use panproto_schema::Schema;
use serde::{Deserialize, Serialize};
use crate::ObjectId;
#[derive(Clone, Debug, Serialize, Deserialize)]
pub enum Object {
Schema(Box<Schema>),
Migration {
src: ObjectId,
tgt: ObjectId,
mapping: Migration,
},
Commit(CommitObject),
Tag(TagObject),
DataSet(DataSetObject),
Complement(ComplementObject),
Protocol(Box<panproto_schema::Protocol>),
Expr(Box<panproto_expr::Expr>),
EditLog(EditLogObject),
}
impl Object {
#[must_use]
pub const fn type_name(&self) -> &'static str {
match self {
Self::Schema(_) => "schema",
Self::Migration { .. } => "migration",
Self::Commit(_) => "commit",
Self::Tag(_) => "tag",
Self::DataSet(_) => "dataset",
Self::Complement(_) => "complement",
Self::Protocol(_) => "protocol",
Self::Expr(_) => "expr",
Self::EditLog(_) => "editlog",
}
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct CommitObject {
pub schema_id: ObjectId,
pub parents: Vec<ObjectId>,
pub migration_id: Option<ObjectId>,
pub protocol: String,
pub author: String,
pub timestamp: u64,
pub message: String,
#[serde(default)]
pub renames: Vec<SiteRename>,
#[serde(default)]
pub protocol_id: Option<ObjectId>,
#[serde(default)]
pub data_ids: Vec<ObjectId>,
#[serde(default)]
pub complement_ids: Vec<ObjectId>,
#[serde(default)]
pub edit_log_ids: Vec<ObjectId>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct DataSetObject {
pub schema_id: ObjectId,
pub data: Vec<u8>,
pub record_count: u64,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ComplementObject {
pub migration_id: ObjectId,
pub data_id: ObjectId,
pub complement: Vec<u8>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct EditLogObject {
pub schema_id: ObjectId,
pub data_id: ObjectId,
pub edits: Vec<u8>,
pub edit_count: u64,
pub final_complement: ObjectId,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct TagObject {
pub target: ObjectId,
pub tagger: String,
pub timestamp: u64,
pub message: String,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn dataset_round_trip() -> Result<(), Box<dyn std::error::Error>> {
let ds = DataSetObject {
schema_id: ObjectId::ZERO,
data: vec![1, 2, 3, 4],
record_count: 42,
};
let bytes = rmp_serde::to_vec(&ds)?;
let ds2: DataSetObject = rmp_serde::from_slice(&bytes)?;
assert_eq!(ds.schema_id, ds2.schema_id);
assert_eq!(ds.data, ds2.data);
assert_eq!(ds.record_count, ds2.record_count);
Ok(())
}
#[test]
fn complement_round_trip() -> Result<(), Box<dyn std::error::Error>> {
let comp = ComplementObject {
migration_id: ObjectId::from_bytes([1; 32]),
data_id: ObjectId::from_bytes([2; 32]),
complement: vec![10, 20, 30],
};
let bytes = rmp_serde::to_vec(&comp)?;
let comp2: ComplementObject = rmp_serde::from_slice(&bytes)?;
assert_eq!(comp.migration_id, comp2.migration_id);
assert_eq!(comp.data_id, comp2.data_id);
assert_eq!(comp.complement, comp2.complement);
Ok(())
}
#[test]
fn edit_log_round_trip() -> Result<(), Box<dyn std::error::Error>> {
let el = EditLogObject {
schema_id: ObjectId::from_bytes([1; 32]),
data_id: ObjectId::from_bytes([2; 32]),
edits: vec![42, 43, 44],
edit_count: 3,
final_complement: ObjectId::from_bytes([3; 32]),
};
let bytes = rmp_serde::to_vec(&el)?;
let el2: EditLogObject = rmp_serde::from_slice(&bytes)?;
assert_eq!(el.schema_id, el2.schema_id);
assert_eq!(el.data_id, el2.data_id);
assert_eq!(el.edits, el2.edits);
assert_eq!(el.edit_count, el2.edit_count);
assert_eq!(el.final_complement, el2.final_complement);
Ok(())
}
#[test]
fn commit_with_edit_logs() -> Result<(), Box<dyn std::error::Error>> {
let commit = CommitObject {
schema_id: ObjectId::ZERO,
parents: vec![],
migration_id: None,
protocol: "test".into(),
author: "test".into(),
timestamp: 0,
message: "test".into(),
renames: vec![],
protocol_id: None,
data_ids: vec![],
complement_ids: vec![],
edit_log_ids: vec![
ObjectId::from_bytes([10; 32]),
ObjectId::from_bytes([11; 32]),
],
};
let bytes = rmp_serde::to_vec(&commit)?;
let commit2: CommitObject = rmp_serde::from_slice(&bytes)?;
assert_eq!(commit.edit_log_ids, commit2.edit_log_ids);
Ok(())
}
}