firedbg_rust_parser/
serde.rs1use anyhow::{Context, Result};
2use sea_streamer_file::ByteSource;
3
4pub async fn to_bson_file<S>(path: &str, bson: &S) -> Result<()>
5where
6 S: serde::Serialize,
7{
8 let mut file_sink = create_file_sink(path)
9 .await
10 .context("Fail to create file sink")?;
11 bson::to_document(bson)?
12 .to_writer(file_sink.as_writer())
13 .context("Fail to write BSON")?;
14 file_sink.flush(1).await.context("Fail to flush")?;
15 Ok(())
16}
17
18pub async fn to_json_file<S>(path: &str, json: &S) -> Result<()>
19where
20 S: serde::Serialize,
21{
22 let mut file_sink = create_file_sink(path)
23 .await
24 .context("Fail to create file sink")?;
25 serde_json::to_writer_pretty(file_sink.as_writer(), json).context("Fail to write JSON")?;
26 file_sink.flush(1).await.context("Fail to flush")?;
27 Ok(())
28}
29
30async fn create_file_sink<T>(path: T) -> Result<sea_streamer_file::FileSink>
31where
32 T: Into<String>,
33{
34 let file_id = sea_streamer_file::FileId::new(path);
35 let async_file = sea_streamer_file::AsyncFile::new_ow(file_id)
36 .await
37 .context("Fail to create async file")?;
38 let res = sea_streamer_file::FileSink::new(async_file, 1_000_000_000)
39 .context("Fail to create file sink")?;
40 Ok(res)
41}
42
43pub async fn from_bson_file<T>(path: &str) -> Result<T>
44where
45 T: serde::de::DeserializeOwned,
46{
47 let file_id = sea_streamer_file::FileId::new(path);
48 let mut file_reader = sea_streamer_file::FileReader::new(file_id)
49 .await
50 .context("Fail to create file reader")?;
51 let file_size = file_reader.file_size();
52 let bytes = file_reader
53 .request_bytes(file_size as usize)
54 .await
55 .context("Fail to read")?;
56 let slice = &bytes.bytes();
57 let res = bson::de::from_slice(slice).context("Fail to deserialize BSON")?;
58 Ok(res)
59}