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 67
use crate::{ compilation::{context::CompilationContext, JSONSchema}, error::{error, no_error, CompilationError, ErrorIterator, ValidationError}, keywords::CompilationResult, paths::InstancePath, validator::Validate, }; use serde_json::{Map, Value}; pub(crate) struct MinPropertiesValidator { limit: u64, } impl MinPropertiesValidator { #[inline] pub(crate) fn compile(schema: &Value) -> CompilationResult { if let Some(limit) = schema.as_u64() { Ok(Box::new(MinPropertiesValidator { limit })) } else { Err(CompilationError::SchemaError) } } } impl Validate for MinPropertiesValidator { 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::min_properties( instance_path.into(), instance, self.limit, )); } } no_error() } } impl ToString for MinPropertiesValidator { fn to_string(&self) -> String { format!("minProperties: {}", self.limit) } } #[inline] pub(crate) fn compile( _: &Map<String, Value>, schema: &Value, _: &CompilationContext, ) -> Option<CompilationResult> { Some(MinPropertiesValidator::compile(schema)) }