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}