This commit is contained in:
parent
29d76032cc
commit
6a5fce3070
3 changed files with 29 additions and 3 deletions
15
ubisync/src/comm/conflict_resolution.rs
Normal file
15
ubisync/src/comm/conflict_resolution.rs
Normal 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
|
||||
}
|
||||
}
|
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue