use json_streaming::nonblocking::*;
use json_streaming::shared::*;
use std::io;
use std::io::Cursor;
use tokio::io::{AsyncRead, AsyncWrite};
#[tokio::main]
async fn main() {
let mut buf = Vec::new();
write(&mut buf).await.unwrap();
let mut r = Cursor::new(buf);
read(&mut r).await.unwrap();
}
async fn write<W>(w: &mut W) -> io::Result<()>
where
W: AsyncWrite + Send + Unpin
{
let mut json_writer = JsonWriter::new_pretty(w);
let mut obj = JsonObject::new(&mut json_writer).await?;
obj.write_string_value("name", "John Smith").await?;
obj.write_u32_value("age", 49).await?;
let mut colors_arr = obj.start_array("favorite-colors").await?;
colors_arr.write_string_value("red").await?;
colors_arr.write_string_value("blue").await?;
colors_arr.write_string_value("yellow").await?;
colors_arr.end().await?;
obj.end().await?;
Ok(())
}
async fn read<R>(r: &mut R) -> JsonParseResult<(), io::Error>
where
R: AsyncRead + Send + Unpin
{
let mut json_reader = JsonReader::new(1024, r);
json_reader.expect_start_object().await?;
loop {
match json_reader.expect_key().await? {
Some("name") => {
let name = json_reader.expect_string().await?;
println!("name: {}", name);
},
Some("age") => {
let age: u32 = json_reader.expect_number().await?;
println!("age: {}", age);
},
Some("favorite-colors") => {
read_favorite_colors(&mut json_reader).await?;
}
Some(_other) => {
return Err(JsonParseError::Parse("unexpected key parsing 'person'", json_reader.location()));
},
None => break,
}
}
Ok(())
}
async fn read_favorite_colors<B: AsMut<[u8]>, R>(r: &mut JsonReader<'_, B, R>) -> JsonParseResult<(), io::Error>
where
R: AsyncRead + Send + Unpin
{
r.expect_start_array().await?;
while let Some(color) = r.expect_string_or_end_array().await? {
println!(" favorite color: {}", color);
}
Ok(())
}