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