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 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,9 +28,17 @@ pub fn handle(state: &CommState, peer: &PeerId, message: Message) {
|
||||||
.expect("State failed");
|
.expect("State failed");
|
||||||
}
|
}
|
||||||
MessageContent::UpdateElement { id, content } => {
|
MessageContent::UpdateElement { id, content } => {
|
||||||
state
|
if let Some(new_content) =
|
||||||
.update_element_content(id.to_owned(), content.to_owned(), message.id().to_owned())
|
merge_element_contents(state, id.clone(), content.to_owned(), message.id().to_owned())
|
||||||
.expect("State failed");
|
{
|
||||||
|
state
|
||||||
|
.update_element_content(
|
||||||
|
id.to_owned(),
|
||||||
|
new_content.to_owned(),
|
||||||
|
message.id().to_owned(),
|
||||||
|
)
|
||||||
|
.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");
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue