jpx_engine/types.rs
1//! Common types for engine requests and responses.
2//!
3//! These types are used for structured input/output, particularly useful
4//! when building APIs or serializing results.
5
6use serde::{Deserialize, Serialize};
7use serde_json::Value;
8
9/// Request to evaluate a JMESPath expression.
10///
11/// This struct packages an expression with its input data, useful for
12/// API endpoints or batch processing.
13///
14/// # Example
15///
16/// ```rust
17/// use jpx_engine::EvalRequest;
18/// use serde_json::json;
19///
20/// let request = EvalRequest {
21/// expression: "users[*].name".to_string(),
22/// input: json!({"users": [{"name": "alice"}]}),
23/// };
24/// ```
25#[derive(Debug, Clone, Serialize, Deserialize)]
26pub struct EvalRequest {
27 /// The JMESPath expression to evaluate
28 pub expression: String,
29 /// The JSON input to evaluate against
30 pub input: Value,
31}
32
33/// Response from evaluating a JMESPath expression.
34///
35/// Wraps the evaluation result in a structured response.
36#[derive(Debug, Clone, Serialize, Deserialize)]
37pub struct EvalResponse {
38 /// The result of evaluation
39 pub result: Value,
40}
41
42/// Result of validating a JMESPath expression.
43///
44/// Returned by [`JpxEngine::validate`](crate::JpxEngine::validate) to indicate
45/// whether an expression has valid syntax.
46///
47/// # Example
48///
49/// ```rust
50/// use jpx_engine::JpxEngine;
51///
52/// let engine = JpxEngine::new();
53///
54/// let result = engine.validate("users[*].name");
55/// assert!(result.valid);
56/// assert!(result.error.is_none());
57///
58/// let result = engine.validate("users[*.name"); // missing bracket
59/// assert!(!result.valid);
60/// assert!(result.error.is_some());
61/// ```
62#[derive(Debug, Clone, Serialize, Deserialize)]
63pub struct ValidationResult {
64 /// `true` if the expression has valid syntax
65 pub valid: bool,
66 /// Error message if validation failed, `None` if valid
67 #[serde(skip_serializing_if = "Option::is_none")]
68 pub error: Option<String>,
69}
70
71/// Result for a single expression in batch evaluation.
72///
73/// Each expression in a batch produces one of these, containing either
74/// a successful result or an error message.
75#[derive(Debug, Clone, Serialize, Deserialize)]
76pub struct BatchExpressionResult {
77 /// The expression that was evaluated
78 pub expression: String,
79 /// The result if evaluation succeeded
80 #[serde(skip_serializing_if = "Option::is_none")]
81 pub result: Option<Value>,
82 /// Error message if evaluation failed
83 #[serde(skip_serializing_if = "Option::is_none")]
84 pub error: Option<String>,
85}
86
87/// Result of batch evaluation.
88///
89/// Contains results for all expressions evaluated in
90/// [`JpxEngine::batch_evaluate`](crate::JpxEngine::batch_evaluate).
91/// Results are in the same order as the input expressions.
92///
93/// # Example
94///
95/// ```rust
96/// use jpx_engine::JpxEngine;
97/// use serde_json::json;
98///
99/// let engine = JpxEngine::new();
100/// let input = json!({"a": 1, "b": 2});
101/// let exprs = vec!["a".to_string(), "b".to_string(), "c".to_string()];
102///
103/// let batch = engine.batch_evaluate(&exprs, &input);
104///
105/// // Results are in order
106/// assert_eq!(batch.results.len(), 3);
107/// assert_eq!(batch.results[0].expression, "a");
108/// assert_eq!(batch.results[0].result, Some(json!(1)));
109/// ```
110#[derive(Debug, Clone, Serialize, Deserialize)]
111pub struct BatchEvaluateResult {
112 /// Results for each expression, in order
113 pub results: Vec<BatchExpressionResult>,
114}