From 6a5fce3070b178122ab73b4d52dd70b7e347968f Mon Sep 17 00:00:00 2001 From: "Philip (a-0)" <@ph:a-0.me> Date: Tue, 13 Feb 2024 18:27:06 +0100 Subject: [PATCH] Added basic element update conflict resolution fo `message_processor`. Closes #14, #16 --- ubisync/src/comm/conflict_resolution.rs | 15 +++++++++++++++ ubisync/src/comm/message_processor.rs | 15 ++++++++++++--- ubisync/src/comm/mod.rs | 2 ++ 3 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 ubisync/src/comm/conflict_resolution.rs diff --git a/ubisync/src/comm/conflict_resolution.rs b/ubisync/src/comm/conflict_resolution.rs new file mode 100644 index 0000000..57a8a83 --- /dev/null +++ b/ubisync/src/comm/conflict_resolution.rs @@ -0,0 +1,15 @@ +use ubisync_lib::types::{ContentUpdateStrategy, ElementContent, ElementId, MessageId}; + +use crate::state::CommState; + + + +pub(crate) fn merge_element_contents(state: &CommState, id: ElementId, incoming: ElementContent, message: MessageId) -> Option { + let element = state.get_element(id)?; + match element.update_strategy { + ContentUpdateStrategy::Overwrite => { + Some(incoming) + }, + _ => None + } +} \ No newline at end of file diff --git a/ubisync/src/comm/message_processor.rs b/ubisync/src/comm/message_processor.rs index 93c2c28..41030ac 100644 --- a/ubisync/src/comm/message_processor.rs +++ b/ubisync/src/comm/message_processor.rs @@ -5,6 +5,7 @@ use ubisync_lib::types::{ContentUpdateStrategy, PeerId}; use ubisync_lib::messages::{Message, MessageContent}; +use crate::comm::conflict_resolution::merge_element_contents; use crate::state::CommState; pub fn handle(state: &CommState, peer: &PeerId, message: Message) { @@ -27,9 +28,17 @@ pub fn handle(state: &CommState, peer: &PeerId, message: Message) { .expect("State failed"); } MessageContent::UpdateElement { id, content } => { - state - .update_element_content(id.to_owned(), content.to_owned(), message.id().to_owned()) - .expect("State failed"); + if let Some(new_content) = + merge_element_contents(state, id.clone(), content.to_owned(), message.id().to_owned()) + { + state + .update_element_content( + id.to_owned(), + new_content.to_owned(), + message.id().to_owned(), + ) + .expect("State failed"); + } } MessageContent::RemoveElement { id } => { state.remove_element(id.to_owned()).expect("State failed"); diff --git a/ubisync/src/comm/mod.rs b/ubisync/src/comm/mod.rs index 6698745..08a67f4 100644 --- a/ubisync/src/comm/mod.rs +++ b/ubisync/src/comm/mod.rs @@ -1,4 +1,6 @@ pub mod message_processor; +mod conflict_resolution; + use tracing::{debug, error, warn}; use ubisync_lib::messages::Message; use ubisync_lib::types::PeerId;