sui_rpc_benchmark/json_rpc/
request_loader.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4/// This module implements the request loader, which is used to load and deserialize
5/// the JSON RPC requests from a jsonl file.
6use anyhow::{Context, Result};
7use chrono::{DateTime, Utc};
8use serde::Deserialize;
9use serde_json::Value;
10use std::{
11    fs::File,
12    io::{BufRead, BufReader},
13};
14
15mod timestamp {
16    use chrono::{DateTime, Utc};
17    use serde::{self, Deserialize, Deserializer};
18
19    pub fn deserialize<'de, D>(deserializer: D) -> Result<DateTime<Utc>, D::Error>
20    where
21        D: Deserializer<'de>,
22    {
23        let s = String::deserialize(deserializer)?;
24        DateTime::parse_from_rfc3339(&s)
25            .map(|dt| dt.with_timezone(&Utc))
26            .map_err(serde::de::Error::custom)
27    }
28}
29
30#[derive(Clone, Debug, Deserialize)]
31pub struct JsonRpcRequestLine {
32    pub method: String,
33    #[serde(rename = "body")]
34    pub body_json: Value,
35    #[serde(with = "timestamp")]
36    pub timestamp: DateTime<Utc>,
37}
38
39pub fn load_json_rpc_requests(file_path: &str) -> Result<Vec<JsonRpcRequestLine>> {
40    let file = File::open(file_path)
41        .with_context(|| format!("Could not open JSON RPC file at {}", file_path))?;
42    let reader = BufReader::new(file);
43
44    let mut requests = Vec::new();
45    // the jsonl file is sorted by timestamp already, so no need to sort the lines
46    for line in reader.lines() {
47        let line = line?;
48        let request_line: JsonRpcRequestLine =
49            serde_json::from_str(&line).with_context(|| "Failed to parse JSON RPC line")?;
50        requests.push(request_line);
51    }
52
53    Ok(requests)
54}