CultLib/docs/research/py-msgpack-default/rmpprobe/src/main.rs
Meta Vens 897be76fa8 Research: how JSON became cultcache-py's payload default, and the MessagePack-default probes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 21:13:41 +02:00

21 lines
1.4 KiB
Rust

fn main() {
let json_obj = br#"{"enabled":true,"kind":"transform","schema":"brokkr.sync.var.v0"}"#;
let r: Result<serde_json::Value, _> = rmp_serde::from_slice(json_obj);
println!("rmp_serde on a JSON object payload: {:?}", r);
let mp = rmp_serde::to_vec(&serde_json::json!({"schema":"x","n":1})).unwrap();
println!("rmp_serde::to_vec of a json! object, first byte {:#04x} len {}", mp[0], mp.len());
let j: Result<serde_json::Map<String, serde_json::Value>, _> = serde_json::from_slice(&mp);
println!("serde_json on that MessagePack map: {:?}", j.map(|_| ()).map_err(|e| e.to_string()));
let mut de = rmp_serde::Deserializer::from_read_ref(&json_obj[..]);
let v: serde_json::Value = serde::Deserialize::deserialize(&mut de).unwrap();
println!("one_value(json obj) = {:?}; one_value(mp) = {:?}", one_value(json_obj), one_value(&mp).map(|_| ()));
println!("consumed {} of {} bytes, value {:?}", de.get_ref().len() as usize, json_obj.len(), v);
}
#[allow(dead_code)]
fn one_value(bytes: &[u8]) -> Result<serde_json::Value, String> {
let mut de = rmp_serde::Deserializer::new(std::io::Cursor::new(bytes));
let v: serde_json::Value = serde::Deserialize::deserialize(&mut de).map_err(|e| e.to_string())?;
let used = de.get_ref().position() as usize;
if used != bytes.len() { return Err(format!("{} trailing bytes after the first MessagePack value", bytes.len() - used)); }
Ok(v)
}