1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
use std::collections::HashSet;
use std::path::Path;
use anyhow::Result;
use cloudflare::endpoints::workerskv::write_bulk::KeyValuePair;
use super::directory_keys_values;
use super::manifest::AssetManifest;
use crate::commands::kv;
use crate::http;
use crate::kv::key::KeyList;
use crate::settings::global_user::GlobalUser;
use crate::settings::toml::Target;
use crate::terminal::message::{Message, StdErr};
pub fn sync(
target: &Target,
user: &GlobalUser,
namespace_id: &str,
path: &Path,
) -> Result<(Vec<KeyValuePair>, Vec<String>, AssetManifest)> {
let client = http::cf_v4_client(user)?;
let remote_keys_iter = KeyList::new(target, client, namespace_id, None)?;
let mut remote_keys: HashSet<String> = HashSet::new();
for remote_key in remote_keys_iter {
match remote_key {
Ok(remote_key) => {
remote_keys.insert(remote_key.name);
}
Err(e) => anyhow::bail!(kv::format_error(e)),
}
}
let (diff_files_to_upload, asset_manifest, _): (Vec<KeyValuePair>, AssetManifest, _) =
directory_keys_values(target, path, Some(&remote_keys))?;
let mut local_keys: HashSet<_> = HashSet::new();
for (_, asset_key) in asset_manifest.iter() {
local_keys.insert(asset_key.clone());
}
let to_delete: Vec<_> = remote_keys
.difference(&local_keys)
.map(|key| key.to_owned())
.collect();
StdErr::success("Success");
Ok((diff_files_to_upload, to_delete, asset_manifest))
}