this repo has no description
1use crate::validation::{RecordValidator, ValidationError};
2use axum::{
3 http::StatusCode,
4 response::{IntoResponse, Response},
5 Json,
6};
7use serde_json::json;
8pub fn validate_record(record: &serde_json::Value, collection: &str) -> Result<(), Response> {
9 let validator = RecordValidator::new();
10 match validator.validate(record, collection) {
11 Ok(_) => Ok(()),
12 Err(ValidationError::MissingType) => Err((
13 StatusCode::BAD_REQUEST,
14 Json(json!({"error": "InvalidRecord", "message": "Record must have a $type field"})),
15 ).into_response()),
16 Err(ValidationError::TypeMismatch { expected, actual }) => Err((
17 StatusCode::BAD_REQUEST,
18 Json(json!({"error": "InvalidRecord", "message": format!("Record $type '{}' does not match collection '{}'", actual, expected)})),
19 ).into_response()),
20 Err(ValidationError::MissingField(field)) => Err((
21 StatusCode::BAD_REQUEST,
22 Json(json!({"error": "InvalidRecord", "message": format!("Missing required field: {}", field)})),
23 ).into_response()),
24 Err(ValidationError::InvalidField { path, message }) => Err((
25 StatusCode::BAD_REQUEST,
26 Json(json!({"error": "InvalidRecord", "message": format!("Invalid field '{}': {}", path, message)})),
27 ).into_response()),
28 Err(ValidationError::InvalidDatetime { path }) => Err((
29 StatusCode::BAD_REQUEST,
30 Json(json!({"error": "InvalidRecord", "message": format!("Invalid datetime format at '{}'", path)})),
31 ).into_response()),
32 Err(e) => Err((
33 StatusCode::BAD_REQUEST,
34 Json(json!({"error": "InvalidRecord", "message": e.to_string()})),
35 ).into_response()),
36 }
37}