1use schemars::JsonSchema;
2use serde::{Deserialize, Serialize};
3use serde_json::Value;
4
5#[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#[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 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#[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#[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#[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}