1use crate::model::Record;
11use crate::Error;
12use base64::Engine as _;
13
14pub const PREFIX: &str = "MS1:";
16
17pub fn encode(record: &Record) -> Result<String, Error> {
19 let json = serde_json::to_vec(record)?;
20 let compressed = miniz_oxide::deflate::compress_to_vec(&json, 9);
21 let b64 = base64::engine::general_purpose::URL_SAFE_NO_PAD.encode(compressed);
22 Ok(format!("{PREFIX}{b64}"))
23}
24
25pub fn encode_json(record: &Record) -> Result<String, Error> {
27 Ok(serde_json::to_string_pretty(record)?)
28}
29
30pub fn decode(text: &str) -> Result<Record, Error> {
33 let trimmed = text.trim();
34 if let Some(b64) = trimmed.strip_prefix(PREFIX) {
35 let compressed = base64::engine::general_purpose::URL_SAFE_NO_PAD
36 .decode(b64.trim())
37 .map_err(|e| Error::Base64(e.to_string()))?;
38 let json = miniz_oxide::inflate::decompress_to_vec(&compressed)
39 .map_err(|e| Error::Inflate(format!("{e:?}")))?;
40 return Ok(serde_json::from_slice(&json)?);
41 }
42 Ok(serde_json::from_str(trimmed)?)
43}