y_octo/doc/
utils.rs

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 or not ascii, it's not a update with guid
30            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}