1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
use crate::{ compilation::{context::CompilationContext, JSONSchema}, error::{error, no_error, CompilationError, ErrorIterator, ValidationError}, keywords::{CompilationResult, InstancePath}, validator::Validate, }; use serde_json::{Map, Value}; pub(crate) struct MaxPropertiesValidator { limit: u64, } impl MaxPropertiesValidator { #[inline] pub(crate) fn compile(schema: &Value) -> CompilationResult { if let Some(limit) = schema.as_u64() { Ok(Box::new(MaxPropertiesValidator { limit })) } else { Err(CompilationError::SchemaError) } } } impl Validate for MaxPropertiesValidator { fn is_valid(&self, _: &JSONSchema, instance: &Value) -> bool { if let Value::Object(item) = instance { if (item.len() as u64) > self.limit { return false; } } true } fn validate<'a>( &self, _: &'a JSONSchema, instance: &'a Value, instance_path: &InstancePath, ) -> ErrorIterator<'a> { if let Value::Object(item) = instance { if (item.len() as u64) > self.limit { return error(ValidationError::max_properties( instance_path.into(), instance, self.limit, )); } } no_error() } } impl ToString for MaxPropertiesValidator { fn to_string(&self) -> String { format!("maxProperties: {}", self.limit) } } #[inline] pub(crate) fn compile( _: &Map<String, Value>, schema: &Value, _: &CompilationContext, ) -> Option<CompilationResult> { Some(MaxPropertiesValidator::compile(schema)) }