1use std::io::Write;
2
3use super::*;
4
5pub fn encode_update_with_guid<S: AsRef<str>>(update: Vec<u8>, guid: S) -> JwstCodecResult<Vec<u8>> {
6 let mut encoder = RawEncoder::default();
7 encoder.write_var_string(guid)?;
8 let mut buffer = encoder.into_inner();
9
10 buffer
11 .write_all(&update)
12 .map_err(|e| JwstCodecError::InvalidWriteBuffer(e.to_string()))?;
13
14 Ok(buffer)
15}
16
17pub fn decode_update_with_guid(update: Vec<u8>) -> JwstCodecResult<(String, Vec<u8>)> {
18 let mut decoder = RawDecoder::new(update);
19 let guid = decoder.read_var_string()?;
20 let update = decoder.drain();
21
22 Ok((guid, update))
23}
24
25pub fn decode_maybe_update_with_guid(binary: Vec<u8>) -> (String, Vec<u8>) {
26 if let Ok((guid, update)) = decode_update_with_guid(binary.clone()) {
27 (
28 guid.clone(),
29 if guid.is_empty() || !guid.is_ascii() {
31 binary
32 } else {
33 update
34 },
35 )
36 } else {
37 ("".into(), binary)
38 }
39}
40
41pub fn encode_update_as_message(update: Vec<u8>) -> JwstCodecResult<Vec<u8>> {
42 let mut buffer = Vec::new();
43 write_sync_message(&mut buffer, &SyncMessage::Doc(DocMessage::Update(update)))
44 .map_err(|e| JwstCodecError::InvalidWriteBuffer(e.to_string()))?;
45
46 Ok(buffer)
47}
48
49pub fn merge_updates_v1<V: AsRef<[u8]>, I: IntoIterator<Item = V>>(updates: I) -> JwstCodecResult<Update> {
50 let updates = updates
51 .into_iter()
52 .map(|u| Update::from_ybinary1(u.as_ref().to_vec()))
53 .collect::<JwstCodecResult<Vec<_>>>()?;
54
55 Ok(Update::merge(updates))
56}