use super::{LogicCondition, OrderTerm, SelectItem};
use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct RpcParams {
pub function_name: String,
pub args: HashMap<String, Value>,
pub filters: Vec<LogicCondition>,
pub order: Vec<OrderTerm>,
pub limit: Option<u64>,
pub offset: Option<u64>,
pub returning: Option<Vec<SelectItem>>,
}
impl RpcParams {
pub fn new(function_name: impl Into<String>, args: HashMap<String, Value>) -> Self {
Self {
function_name: function_name.into(),
args,
filters: Vec::new(),
order: Vec::new(),
limit: None,
offset: None,
returning: None,
}
}
pub fn with_filters(mut self, filters: Vec<LogicCondition>) -> Self {
self.filters = filters;
self
}
pub fn with_order(mut self, order: Vec<OrderTerm>) -> Self {
self.order = order;
self
}
pub fn with_limit(mut self, limit: u64) -> Self {
self.limit = Some(limit);
self
}
pub fn with_offset(mut self, offset: u64) -> Self {
self.offset = Some(offset);
self
}
pub fn with_returning(mut self, returning: Vec<SelectItem>) -> Self {
self.returning = Some(returning);
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_rpc_params_new() {
let mut args = HashMap::new();
args.insert("name".to_string(), Value::String("test".to_string()));
let params = RpcParams::new("my_function", args.clone());
assert_eq!(params.function_name, "my_function");
assert_eq!(params.args, args);
assert!(params.filters.is_empty());
assert!(params.order.is_empty());
assert_eq!(params.limit, None);
assert_eq!(params.offset, None);
assert_eq!(params.returning, None);
}
#[test]
fn test_rpc_params_builder() {
let mut args = HashMap::new();
args.insert("user_id".to_string(), Value::Number(123.into()));
let params = RpcParams::new("get_user_posts", args)
.with_limit(10)
.with_offset(20);
assert_eq!(params.function_name, "get_user_posts");
assert_eq!(params.limit, Some(10));
assert_eq!(params.offset, Some(20));
}
#[test]
fn test_rpc_params_empty_args() {
let params = RpcParams::new("health_check", HashMap::new());
assert_eq!(params.function_name, "health_check");
assert!(params.args.is_empty());
}
}