forge_runtime/gateway/
request.rs

1use serde::{Deserialize, Serialize};
2
3/// RPC request body for function calls.
4#[derive(Debug, Clone, Serialize, Deserialize)]
5pub struct RpcRequest {
6    /// Function name to invoke.
7    pub function: String,
8    /// Function arguments as JSON.
9    #[serde(default)]
10    pub args: serde_json::Value,
11}
12
13impl RpcRequest {
14    /// Create a new RPC request.
15    pub fn new(function: impl Into<String>, args: serde_json::Value) -> Self {
16        Self {
17            function: function.into(),
18            args,
19        }
20    }
21}
22
23/// Batch RPC request containing multiple function calls.
24#[allow(dead_code)]
25#[derive(Debug, Clone, Serialize, Deserialize)]
26pub struct BatchRpcRequest {
27    /// List of requests to execute.
28    pub requests: Vec<RpcRequest>,
29}
30
31#[cfg(test)]
32mod tests {
33    use super::*;
34
35    #[test]
36    fn test_rpc_request_deserialization() {
37        let json = r#"{"function": "getUser", "args": {"id": "123"}}"#;
38        let req: RpcRequest = serde_json::from_str(json).unwrap();
39        assert_eq!(req.function, "getUser");
40        assert_eq!(req.args["id"], "123");
41    }
42
43    #[test]
44    fn test_rpc_request_default_args() {
45        let json = r#"{"function": "healthCheck"}"#;
46        let req: RpcRequest = serde_json::from_str(json).unwrap();
47        assert_eq!(req.function, "healthCheck");
48        assert!(req.args.is_null());
49    }
50
51    #[test]
52    fn test_batch_request() {
53        let json = r#"{"requests": [{"function": "a"}, {"function": "b"}]}"#;
54        let batch: BatchRpcRequest = serde_json::from_str(json).unwrap();
55        assert_eq!(batch.requests.len(), 2);
56    }
57}