util.rs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. use crate::errors::{SyncError, SyncResult};
  2. use lib_ot::core::{DeltaOperations, OperationAttributes, OperationTransform};
  3. use revision_model::Revision;
  4. use serde::de::DeserializeOwned;
  5. pub fn pair_rev_id_from_revision_pbs(revisions: &[Revision]) -> (i64, i64) {
  6. let mut rev_id = 0;
  7. revisions.iter().for_each(|revision| {
  8. if rev_id < revision.rev_id {
  9. rev_id = revision.rev_id;
  10. }
  11. });
  12. if rev_id > 0 {
  13. (rev_id - 1, rev_id)
  14. } else {
  15. (0, rev_id)
  16. }
  17. }
  18. #[tracing::instrument(level = "trace", skip(revisions), err)]
  19. pub fn make_operations_from_revisions<T>(revisions: Vec<Revision>) -> SyncResult<DeltaOperations<T>>
  20. where
  21. T: OperationAttributes + DeserializeOwned + OperationAttributes + serde::Serialize,
  22. {
  23. let mut new_operations = DeltaOperations::<T>::new();
  24. for revision in revisions {
  25. if revision.bytes.is_empty() {
  26. return Err(SyncError::unexpected_empty_revision().context("Unexpected Empty revision"));
  27. }
  28. let operations = DeltaOperations::<T>::from_bytes(revision.bytes).map_err(|e| {
  29. let err_msg = format!("Deserialize revision failed: {:?}", e);
  30. SyncError::internal().context(err_msg)
  31. })?;
  32. new_operations = new_operations.compose(&operations)?;
  33. }
  34. Ok(new_operations)
  35. }
  36. #[inline]
  37. pub fn next(rev_id: i64) -> i64 {
  38. rev_id + 1
  39. }