use std::collections::{BTreeMap, BTreeSet};
use super::hunk::{FolderName, FolderSyncHunk, FoldersName};
use crate::sync::SyncDestination;
pub type FolderSyncPatch = BTreeSet<FolderSyncHunk>;
pub type FolderSyncPatches = BTreeMap<FolderName, FolderSyncPatch>;
pub fn build(
local_cache: FoldersName,
local: FoldersName,
remote_cache: FoldersName,
remote: FoldersName,
) -> FolderSyncPatches {
let mut folders = BTreeSet::new();
folders.extend(local_cache.clone());
folders.extend(local.clone());
folders.extend(remote_cache.clone());
folders.extend(remote.clone());
let patches = folders.into_iter().map(|folder| {
let local_cache = local_cache.get(&folder);
let local = local.get(&folder);
let remote_cache = remote_cache.get(&folder);
let remote = remote.get(&folder);
let patch = match (local_cache, local, remote_cache, remote) {
(None, None, None, None) => BTreeSet::from_iter([]),
(None, None, None, Some(_)) => BTreeSet::from_iter([
FolderSyncHunk::Cache(folder.clone(), SyncDestination::Left),
FolderSyncHunk::Create(folder.clone(), SyncDestination::Left),
FolderSyncHunk::Cache(folder.clone(), SyncDestination::Right),
]),
(None, None, Some(_), None) => BTreeSet::from_iter([FolderSyncHunk::Uncache(
folder.clone(),
SyncDestination::Right,
)]),
(None, None, Some(_), Some(_)) => BTreeSet::from_iter([
FolderSyncHunk::Cache(folder.clone(), SyncDestination::Left),
FolderSyncHunk::Create(folder.clone(), SyncDestination::Left),
]),
(None, Some(_), None, None) => BTreeSet::from_iter([
FolderSyncHunk::Cache(folder.clone(), SyncDestination::Left),
FolderSyncHunk::Cache(folder.clone(), SyncDestination::Right),
FolderSyncHunk::Create(folder.clone(), SyncDestination::Right),
]),
(None, Some(_), None, Some(_)) => BTreeSet::from_iter([
FolderSyncHunk::Cache(folder.clone(), SyncDestination::Left),
FolderSyncHunk::Cache(folder.clone(), SyncDestination::Right),
]),
(None, Some(_), Some(_), None) => BTreeSet::from_iter([
FolderSyncHunk::Cache(folder.clone(), SyncDestination::Left),
FolderSyncHunk::Create(folder.clone(), SyncDestination::Right),
]),
(None, Some(_), Some(_), Some(_)) => {
BTreeSet::from_iter([FolderSyncHunk::Cache(folder.clone(), SyncDestination::Left)])
}
(Some(_), None, None, None) => BTreeSet::from_iter([FolderSyncHunk::Uncache(
folder.clone(),
SyncDestination::Left,
)]),
(Some(_), None, None, Some(_)) => BTreeSet::from_iter([
FolderSyncHunk::Create(folder.clone(), SyncDestination::Left),
FolderSyncHunk::Cache(folder.clone(), SyncDestination::Right),
]),
(Some(_), None, Some(_), None) => BTreeSet::from_iter([
FolderSyncHunk::Uncache(folder.clone(), SyncDestination::Left),
FolderSyncHunk::Uncache(folder.clone(), SyncDestination::Right),
]),
(Some(_), None, Some(_), Some(_)) => BTreeSet::from_iter([
FolderSyncHunk::Uncache(folder.clone(), SyncDestination::Left),
FolderSyncHunk::Uncache(folder.clone(), SyncDestination::Right),
FolderSyncHunk::Delete(folder.clone(), SyncDestination::Right),
]),
(Some(_), Some(_), None, None) => BTreeSet::from_iter([
FolderSyncHunk::Cache(folder.clone(), SyncDestination::Right),
FolderSyncHunk::Create(folder.clone(), SyncDestination::Right),
]),
(Some(_), Some(_), None, Some(_)) => BTreeSet::from_iter([FolderSyncHunk::Cache(
folder.clone(),
SyncDestination::Right,
)]),
(Some(_), Some(_), Some(_), None) => BTreeSet::from_iter([
FolderSyncHunk::Uncache(folder.clone(), SyncDestination::Left),
FolderSyncHunk::Delete(folder.clone(), SyncDestination::Left),
FolderSyncHunk::Uncache(folder.clone(), SyncDestination::Right),
]),
(Some(_), Some(_), Some(_), Some(_)) => BTreeSet::from_iter([]),
};
(folder, patch)
});
BTreeMap::from_iter(patches)
}
#[cfg(test)]
mod tests {
use std::collections::{BTreeMap, BTreeSet};
use super::{FolderSyncHunk, FoldersName};
use crate::sync::SyncDestination;
#[test]
fn build_folder_patch() {
assert_eq!(
super::build(
FoldersName::default(),
FoldersName::default(),
FoldersName::default(),
FoldersName::default(),
),
BTreeMap::new()
);
assert_eq!(
super::build(
FoldersName::default(),
FoldersName::default(),
FoldersName::default(),
FoldersName::from_iter(["folder".into()]),
),
BTreeMap::from_iter([(
"folder".into(),
BTreeSet::from_iter([
FolderSyncHunk::Cache("folder".into(), SyncDestination::Left),
FolderSyncHunk::Create("folder".into(), SyncDestination::Left),
FolderSyncHunk::Cache("folder".into(), SyncDestination::Right),
])
)]),
);
assert_eq!(
super::build(
FoldersName::default(),
FoldersName::default(),
FoldersName::from_iter(["folder".into()]),
FoldersName::default(),
),
BTreeMap::from_iter([(
"folder".into(),
BTreeSet::from_iter([FolderSyncHunk::Uncache(
"folder".into(),
SyncDestination::Right
)]),
)]),
);
assert_eq!(
super::build(
FoldersName::default(),
FoldersName::default(),
FoldersName::from_iter(["folder".into()]),
FoldersName::from_iter(["folder".into()]),
),
BTreeMap::from_iter([(
"folder".into(),
BTreeSet::from_iter([
FolderSyncHunk::Cache("folder".into(), SyncDestination::Left),
FolderSyncHunk::Create("folder".into(), SyncDestination::Left),
]),
)]),
);
assert_eq!(
super::build(
FoldersName::default(),
FoldersName::from_iter(["folder".into()]),
FoldersName::default(),
FoldersName::default(),
),
BTreeMap::from_iter([(
"folder".into(),
BTreeSet::from_iter([
FolderSyncHunk::Cache("folder".into(), SyncDestination::Left),
FolderSyncHunk::Cache("folder".into(), SyncDestination::Right),
FolderSyncHunk::Create("folder".into(), SyncDestination::Right),
]),
)]),
);
assert_eq!(
super::build(
FoldersName::default(),
FoldersName::from_iter(["folder".into()]),
FoldersName::default(),
FoldersName::from_iter(["folder".into()]),
),
BTreeMap::from_iter([(
"folder".into(),
BTreeSet::from_iter([
FolderSyncHunk::Cache("folder".into(), SyncDestination::Left),
FolderSyncHunk::Cache("folder".into(), SyncDestination::Right),
]),
)]),
);
assert_eq!(
super::build(
FoldersName::default(),
FoldersName::from_iter(["folder".into()]),
FoldersName::from_iter(["folder".into()]),
FoldersName::default(),
),
BTreeMap::from_iter([(
"folder".into(),
BTreeSet::from_iter([
FolderSyncHunk::Cache("folder".into(), SyncDestination::Left),
FolderSyncHunk::Create("folder".into(), SyncDestination::Right),
]),
)]),
);
assert_eq!(
super::build(
FoldersName::default(),
FoldersName::from_iter(["folder".into()]),
FoldersName::from_iter(["folder".into()]),
FoldersName::from_iter(["folder".into()]),
),
BTreeMap::from_iter([(
"folder".into(),
BTreeSet::from_iter([FolderSyncHunk::Cache(
"folder".into(),
SyncDestination::Left
)]),
)]),
);
assert_eq!(
super::build(
FoldersName::from_iter(["folder".into()]),
FoldersName::default(),
FoldersName::default(),
FoldersName::default(),
),
BTreeMap::from_iter([(
"folder".into(),
BTreeSet::from_iter([FolderSyncHunk::Uncache(
"folder".into(),
SyncDestination::Left
)]),
)]),
);
assert_eq!(
super::build(
FoldersName::from_iter(["folder".into()]),
FoldersName::default(),
FoldersName::default(),
FoldersName::from_iter(["folder".into()]),
),
BTreeMap::from_iter([(
"folder".into(),
BTreeSet::from_iter([
FolderSyncHunk::Create("folder".into(), SyncDestination::Left),
FolderSyncHunk::Cache("folder".into(), SyncDestination::Right),
]),
)]),
);
assert_eq!(
super::build(
FoldersName::from_iter(["folder".into()]),
FoldersName::default(),
FoldersName::from_iter(["folder".into()]),
FoldersName::default(),
),
BTreeMap::from_iter([(
"folder".into(),
BTreeSet::from_iter([
FolderSyncHunk::Uncache("folder".into(), SyncDestination::Left),
FolderSyncHunk::Uncache("folder".into(), SyncDestination::Right),
]),
)]),
);
assert_eq!(
super::build(
FoldersName::from_iter(["folder".into()]),
FoldersName::default(),
FoldersName::from_iter(["folder".into()]),
FoldersName::from_iter(["folder".into()]),
),
BTreeMap::from_iter([(
"folder".into(),
BTreeSet::from_iter([
FolderSyncHunk::Uncache("folder".into(), SyncDestination::Left),
FolderSyncHunk::Uncache("folder".into(), SyncDestination::Right),
FolderSyncHunk::Delete("folder".into(), SyncDestination::Right),
]),
)]),
);
assert_eq!(
super::build(
FoldersName::from_iter(["folder".into()]),
FoldersName::from_iter(["folder".into()]),
FoldersName::default(),
FoldersName::default(),
),
BTreeMap::from_iter([(
"folder".into(),
BTreeSet::from_iter([
FolderSyncHunk::Cache("folder".into(), SyncDestination::Right),
FolderSyncHunk::Create("folder".into(), SyncDestination::Right),
]),
)]),
);
assert_eq!(
super::build(
FoldersName::from_iter(["folder".into()]),
FoldersName::from_iter(["folder".into()]),
FoldersName::default(),
FoldersName::from_iter(["folder".into()]),
),
BTreeMap::from_iter([(
"folder".into(),
BTreeSet::from_iter([FolderSyncHunk::Cache(
"folder".into(),
SyncDestination::Right
)]),
)]),
);
assert_eq!(
super::build(
FoldersName::from_iter(["folder".into()]),
FoldersName::from_iter(["folder".into()]),
FoldersName::from_iter(["folder".into()]),
FoldersName::default(),
),
BTreeMap::from_iter([(
"folder".into(),
BTreeSet::from_iter([
FolderSyncHunk::Uncache("folder".into(), SyncDestination::Left),
FolderSyncHunk::Delete("folder".into(), SyncDestination::Left),
FolderSyncHunk::Uncache("folder".into(), SyncDestination::Right),
]),
)]),
);
assert_eq!(
super::build(
FoldersName::from_iter(["folder".into()]),
FoldersName::from_iter(["folder".into()]),
FoldersName::from_iter(["folder".into()]),
FoldersName::from_iter(["folder".into()]),
),
BTreeMap::from_iter([("folder".into(), BTreeSet::from_iter([]))])
);
}
}