use serde_json; use serde::{Serialize, Deserialize}; use anyhow::bail; #[derive(Debug, Serialize, Deserialize)] pub enum Header { State(StateMeta), Cursor, Join, Leave, UsersInfo{my_uid: u64, others: Vec}, } #[derive(Debug, Default, Serialize, Deserialize)] pub struct StateMeta { pub sender_power: u64, pub generation: u64, } pub fn parse_header(m: &str) -> anyhow::Result
{ let zero = m.find('\0').unwrap_or(m.len()); Ok(serde_json::from_str::
(&m[..zero])?) } pub fn parse_uid_header(m: &str) -> anyhow::Result<(u64, Header)>{ if let Some(zero) = m.find('\0') { let uid = m[..zero].parse::()?; Ok((uid, parse_header(&m[zero+1..])?)) } else { bail!("no \\0 message, wanted to split off uid."); } } fn main(){ let h = Header::State(StateMeta{sender_power: 345, generation: 1}); let j = serde_json::to_string_pretty(&h).unwrap(); println!("{}", j); }