cesrox 2.0.0-beta.5

Implementation of Composable Event Streaming Representation (CESR)
Documentation
use std::{collections::HashMap, io::Cursor};

use nom::error::{make_error, ErrorKind};
use rmp_serde as serde_mgpk;
use serde::Deserialize;
use serde_json::Value;

use super::Payload;

pub(crate) fn json_message(s: &[u8]) -> nom::IResult<&[u8], Payload> {
    let mut stream = serde_json::Deserializer::from_slice(s).into_iter::<Value>();
    match stream.next() {
        Some(Ok(_event)) => Ok((
            &s[stream.byte_offset()..],
            Payload::JSON(s[..stream.byte_offset()].to_vec()),
        )),
        _ => Err(nom::Err::Error(make_error(s, ErrorKind::IsNot))),
    }
}

pub(crate) fn cbor_message(s: &[u8]) -> nom::IResult<&[u8], Payload> {
    let mut stream = serde_cbor::Deserializer::from_slice(s).into_iter::<serde_cbor::Value>();
    match stream.next() {
        Some(Ok(_event)) => Ok((
            &s[stream.byte_offset()..],
            Payload::CBOR(s[..stream.byte_offset()].to_vec()),
        )),
        _ => Err(nom::Err::Error(make_error(s, ErrorKind::IsNot))),
    }
}

pub(crate) fn mgpk_message(s: &[u8]) -> nom::IResult<&[u8], Payload> {
    let mut deser = serde_mgpk::Deserializer::new(Cursor::new(s));
    let deserialized: Result<HashMap<String, String>, _> = Deserialize::deserialize(&mut deser);
    match deserialized {
        Ok(_event) => Ok((
            &s[deser.get_ref().position() as usize..],
            Payload::MGPK(s[..deser.get_ref().position() as usize].to_vec()),
        )),
        _ => Err(nom::Err::Error(make_error(s, ErrorKind::IsNot))),
    }
}