firedbg_rust_parser/
serde.rs

1use 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}