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 validate_record_with_rkey(record, collection, None)
11}
12
13pub fn validate_record_with_rkey(
14 record: &serde_json::Value,
15 collection: &str,
16 rkey: Option<&str>,
17) -> Result<(), Box<Response>> {
18 let validator = RecordValidator::new();
19 match validator.validate_with_rkey(record, collection, rkey) {
20 Ok(_) => Ok(()),
21 Err(ValidationError::MissingType) => Err(Box::new((
22 StatusCode::BAD_REQUEST,
23 Json(json!({"error": "InvalidRecord", "message": "Record must have a $type field"})),
24 ).into_response())),
25 Err(ValidationError::TypeMismatch { expected, actual }) => Err(Box::new((
26 StatusCode::BAD_REQUEST,
27 Json(json!({"error": "InvalidRecord", "message": format!("Record $type '{}' does not match collection '{}'", actual, expected)})),
28 ).into_response())),
29 Err(ValidationError::MissingField(field)) => Err(Box::new((
30 StatusCode::BAD_REQUEST,
31 Json(json!({"error": "InvalidRecord", "message": format!("Missing required field: {}", field)})),
32 ).into_response())),
33 Err(ValidationError::InvalidField { path, message }) => Err(Box::new((
34 StatusCode::BAD_REQUEST,
35 Json(json!({"error": "InvalidRecord", "message": format!("Invalid field '{}': {}", path, message)})),
36 ).into_response())),
37 Err(ValidationError::InvalidDatetime { path }) => Err(Box::new((
38 StatusCode::BAD_REQUEST,
39 Json(json!({"error": "InvalidRecord", "message": format!("Invalid datetime format at '{}'", path)})),
40 ).into_response())),
41 Err(ValidationError::BannedContent { path }) => Err(Box::new((
42 StatusCode::BAD_REQUEST,
43 Json(json!({"error": "InvalidRecord", "message": format!("Unacceptable slur in record at '{}'", path)})),
44 ).into_response())),
45 Err(e) => Err(Box::new((
46 StatusCode::BAD_REQUEST,
47 Json(json!({"error": "InvalidRecord", "message": e.to_string()})),
48 ).into_response())),
49 }
50}