Added basic element update conflict resolution fo message_processor. Closes #14, #16

This commit is contained in:
Philip (a-0) 2024-02-13 18:27:06 +01:00
parent 29d76032cc
commit 6a5fce3070
3 changed files with 29 additions and 3 deletions

View file

@ -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<ElementContent> {
let element = state.get_element(id)?;
match element.update_strategy {
ContentUpdateStrategy::Overwrite => {
Some(incoming)
},
_ => None
}
}

View file

@ -5,6 +5,7 @@ use ubisync_lib::types::{ContentUpdateStrategy, PeerId};
use ubisync_lib::messages::{Message, MessageContent}; use ubisync_lib::messages::{Message, MessageContent};
use crate::comm::conflict_resolution::merge_element_contents;
use crate::state::CommState; use crate::state::CommState;
pub fn handle(state: &CommState, peer: &PeerId, message: Message) { pub fn handle(state: &CommState, peer: &PeerId, message: Message) {
@ -27,10 +28,18 @@ pub fn handle(state: &CommState, peer: &PeerId, message: Message) {
.expect("State failed"); .expect("State failed");
} }
MessageContent::UpdateElement { id, content } => { MessageContent::UpdateElement { id, content } => {
if let Some(new_content) =
merge_element_contents(state, id.clone(), content.to_owned(), message.id().to_owned())
{
state state
.update_element_content(id.to_owned(), content.to_owned(), message.id().to_owned()) .update_element_content(
id.to_owned(),
new_content.to_owned(),
message.id().to_owned(),
)
.expect("State failed"); .expect("State failed");
} }
}
MessageContent::RemoveElement { id } => { MessageContent::RemoveElement { id } => {
state.remove_element(id.to_owned()).expect("State failed"); state.remove_element(id.to_owned()).expect("State failed");
} }

View file

@ -1,4 +1,6 @@
pub mod message_processor; pub mod message_processor;
mod conflict_resolution;
use tracing::{debug, error, warn}; use tracing::{debug, error, warn};
use ubisync_lib::messages::Message; use ubisync_lib::messages::Message;
use ubisync_lib::types::PeerId; use ubisync_lib::types::PeerId;