Skip to main content

qa_spec/
answers.rs

1use schemars::JsonSchema;
2use serde::{Deserialize, Serialize};
3use serde_json::Value;
4
5/// Optional metadata paired with an `AnswerSet`.
6#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
7pub struct Meta {
8    #[serde(default, skip_serializing_if = "Option::is_none")]
9    pub created_at: Option<String>,
10    #[serde(default, skip_serializing_if = "Option::is_none")]
11    pub updated_at: Option<String>,
12}
13
14/// Represents in-progress answers for a given form spec version.
15#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
16pub struct AnswerSet {
17    pub form_id: String,
18    pub spec_version: String,
19    pub answers: Value,
20    #[serde(default, skip_serializing_if = "Option::is_none")]
21    pub meta: Option<Meta>,
22}
23
24impl AnswerSet {
25    /// Creates a fresh empty answer set for a form.
26    pub fn new(form_id: impl Into<String>, spec_version: impl Into<String>) -> Self {
27        Self {
28            form_id: form_id.into(),
29            spec_version: spec_version.into(),
30            answers: Value::Object(Default::default()),
31            meta: None,
32        }
33    }
34}
35
36/// Progress tracking state for flows.
37#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
38pub struct ProgressState {
39    #[serde(skip_serializing_if = "Option::is_none")]
40    pub current_step: Option<String>,
41    pub completed: bool,
42    #[serde(default, skip_serializing_if = "Vec::is_empty")]
43    pub history: Vec<String>,
44}
45
46/// Validation error metadata reported by the engine.
47#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
48pub struct ValidationError {
49    #[serde(default, skip_serializing_if = "Option::is_none")]
50    pub question_id: Option<String>,
51    #[serde(default, skip_serializing_if = "Option::is_none")]
52    pub path: Option<String>,
53    pub message: String,
54    #[serde(default, skip_serializing_if = "Option::is_none")]
55    pub code: Option<String>,
56}
57
58/// Result returned from `validate_answers`.
59#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
60pub struct ValidationResult {
61    pub valid: bool,
62    #[serde(default, skip_serializing_if = "Vec::is_empty")]
63    pub errors: Vec<ValidationError>,
64    #[serde(default, skip_serializing_if = "Vec::is_empty")]
65    pub missing_required: Vec<String>,
66    #[serde(default, skip_serializing_if = "Vec::is_empty")]
67    pub unknown_fields: Vec<String>,
68}