use core::error::Error;
use std::fmt::Display;
use json_streaming::blocking::*;
use json_streaming::shared::*;
#[derive(Debug)]
enum NoError {}
impl Display for NoError {
fn fmt(&self, _: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
unreachable!()
}
}
impl Error for NoError {}
struct FixedWriteBuffer {
data: [u8; 4096],
index: usize,
}
impl FixedWriteBuffer {
fn new() -> Self {
FixedWriteBuffer {
data: [0u8;4096],
index: 0,
}
}
}
impl BlockingWrite for FixedWriteBuffer {
type Error = NoError;
fn write_all(&mut self, buf: &[u8]) -> Result<(), Self::Error> {
self.data[self.index..self.index+buf.len()].copy_from_slice(buf);
self.index += buf.len();
Ok(())
}
}
struct SliceReadBuffer<'a> {
data: &'a [u8],
index: usize,
}
impl BlockingRead for SliceReadBuffer<'_> {
type Error = NoError;
fn read(&mut self) -> Result<Option<u8>, Self::Error> {
let result = if self.index < self.data.len() {
Some(self.data[self.index])
}
else {
None
};
self.index += 1;
Ok(result)
}
}
fn main() -> Result<(), NoError> {
let mut write_buf = FixedWriteBuffer::new();
let mut json_writer = JsonWriter::new_pretty(&mut write_buf);
let mut obj = JsonObject::new(&mut json_writer)?;
obj.write_string_value("name", "John Doe")?;
obj.write_u32_value("age", 42)?;
obj.end()?;
json_writer.flush()?;
let mut read_json_buffer = SliceReadBuffer {
data: &write_buf.data[..write_buf.index],
index: 0,
};
let mut reader_internal_buffer = [0u8;64];
let mut json_reader = JsonReader::new_with_provided_buffer(&mut reader_internal_buffer, &mut read_json_buffer, false);
do_read(&mut json_reader)
.expect("no errors in this example - real world code would do some error handling here");
Ok(())
}
fn do_read(json_reader: &mut JsonReader<&mut [u8;64], SliceReadBuffer>) -> JsonParseResult<(), NoError> {
json_reader.expect_start_object()?;
loop {
match json_reader.expect_key()? {
Some("name") => {
let _name = json_reader.expect_string()?;
}
Some("age") => {
let _age = json_reader.expect_number::<u32>()?;
}
Some(_) => {
return Err(JsonParseError::Parse("unexpected key", json_reader.location()));
}
None => {
break;
}
}
}
Ok(())
}