use holo_hash::{ActionHash, AgentPubKey, AnyLinkableHash, DnaHash, EntryHash};
use holochain_integrity_types::prelude::{
Action, ActionData, ActionHeader, CreateData, CreateLinkData, DeleteData, DeleteLinkData,
EntryType, LinkTag, MembraneProof, Timestamp, UnitEnum, UpdateData, WrongActionError,
};
mod flat_op_activity;
mod flat_op_entry;
mod flat_op_record;
mod typed_action;
pub use flat_op_activity::*;
pub use flat_op_entry::*;
pub use flat_op_record::*;
pub use typed_action::*;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum FlatOp<ET, LT>
where
ET: UnitEnum,
{
CreateRecord(OpRecord<ET, LT>),
CreateEntry(OpEntry<ET>),
AgentActivity(OpActivity<<ET as UnitEnum>::Unit, LT>),
Link(OpLink<LT>),
Update(OpUpdate<ET>),
Delete(OpDelete),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum OpLink<LT> {
CreateLink {
link_type: LT,
action: TypedAction<CreateLinkData>,
},
DeleteLink {
original_action: TypedAction<CreateLinkData>,
link_type: LT,
action: TypedAction<DeleteLinkData>,
},
}
impl<LT> OpLink<LT> {
pub fn base_address(&self) -> &AnyLinkableHash {
match self {
OpLink::CreateLink { action, .. } => &action.data.base_address,
OpLink::DeleteLink { action, .. } => &action.data.base_address,
}
}
pub fn target_address(&self) -> &AnyLinkableHash {
match self {
OpLink::CreateLink { action, .. } => &action.data.target_address,
OpLink::DeleteLink {
original_action, ..
} => &original_action.data.target_address,
}
}
pub fn tag(&self) -> &LinkTag {
match self {
OpLink::CreateLink { action, .. } => &action.data.tag,
OpLink::DeleteLink {
original_action, ..
} => &original_action.data.tag,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::test_utils::short_hand::{ah, ak, lh};
use holochain_integrity_types::prelude::{LinkType, ZomeIndex};
fn header() -> ActionHeader {
ActionHeader {
author: ak(1),
timestamp: Timestamp::from_micros(0),
action_seq: 3,
prev_action: Some(ah(2)),
}
}
fn create_link_data() -> CreateLinkData {
CreateLinkData {
base_address: lh(3),
target_address: lh(4),
zome_index: ZomeIndex(0),
link_type: LinkType(0),
tag: LinkTag(vec![]),
}
}
#[test]
fn create_link_getters_read_action_data() {
let op = OpLink::CreateLink {
link_type: (),
action: TypedAction {
header: header(),
data: create_link_data(),
},
};
assert_eq!(op.base_address(), &lh(3));
assert_eq!(op.target_address(), &lh(4));
assert_eq!(op.tag(), &LinkTag(vec![]));
}
#[test]
fn delete_link_getters_read_original_action_and_delete_data() {
let op = OpLink::DeleteLink {
original_action: TypedAction {
header: header(),
data: create_link_data(),
},
link_type: (),
action: TypedAction {
header: header(),
data: DeleteLinkData {
base_address: lh(3),
link_add_address: ah(5),
},
},
};
assert_eq!(op.base_address(), &lh(3));
assert_eq!(op.target_address(), &lh(4));
assert_eq!(op.tag(), &LinkTag(vec![]));
}
}