From 00e0e9e3f87d982169765c101c3469ccbc34b213 Mon Sep 17 00:00:00 2001 From: acdupont Date: Fri, 31 Mar 2023 19:13:45 -0400 Subject: [PATCH] Add support for abstract dict and vector types (#41) --- src/schema.jl | 10 +++++++--- src/validation.jl | 50 ++++++++++++++++++++++++++++++++++------------- 2 files changed, 43 insertions(+), 17 deletions(-) diff --git a/src/schema.jl b/src/schema.jl index cd20e98..d8591ac 100644 --- a/src/schema.jl +++ b/src/schema.jl @@ -55,7 +55,7 @@ function _recurse_get_element(schema::AbstractDict, element::String) return schema[element] end -function _recurse_get_element(schema::Vector, element::String) +function _recurse_get_element(schema::AbstractVector, element::String) index = tryparse(Int, element) # Remember that `index` is 0-indexed! if index === nothing error("expected integer array index instead of '$(element)'.") @@ -115,7 +115,7 @@ end resolve_refs!(::Any, ::URIs.URI, ::AbstractDict, ::String) = nothing function resolve_refs!( - schema::Vector, + schema::AbstractVector, uri::URIs.URI, id_map::AbstractDict, parent_dir::String, @@ -162,7 +162,11 @@ end build_id_map!(::AbstractDict, ::Any, ::URIs.URI) = nothing -function build_id_map!(id_map::AbstractDict, schema::Vector, uri::URIs.URI) +function build_id_map!( + id_map::AbstractDict, + schema::AbstractVector, + uri::URIs.URI, +) build_id_map!.(Ref(id_map), schema, Ref(uri)) return end diff --git a/src/validation.jl b/src/validation.jl index 0a56d6d..0a333de 100644 --- a/src/validation.jl +++ b/src/validation.jl @@ -110,7 +110,7 @@ _validate(::Any, ::Any, ::Val, ::Any, ::String) = nothing ### # 9.2.1.1 -function _validate(x, schema, ::Val{:allOf}, val::Vector, path::String) +function _validate(x, schema, ::Val{:allOf}, val::AbstractVector, path::String) for v in val ret = _validate(x, v, path) if ret !== nothing @@ -121,7 +121,7 @@ function _validate(x, schema, ::Val{:allOf}, val::Vector, path::String) end # 9.2.1.2 -function _validate(x, schema, ::Val{:anyOf}, val::Vector, path::String) +function _validate(x, schema, ::Val{:anyOf}, val::AbstractVector, path::String) for v in val if _validate(x, v, path) === nothing return @@ -131,7 +131,7 @@ function _validate(x, schema, ::Val{:anyOf}, val::Vector, path::String) end # 9.2.1.3 -function _validate(x, schema, ::Val{:oneOf}, val::Vector, path::String) +function _validate(x, schema, ::Val{:oneOf}, val::AbstractVector, path::String) found_match = false for v in val if _validate(x, v, path) === nothing @@ -162,7 +162,7 @@ end # 9.3.1.1 function _validate( - x::Vector, + x::AbstractVector, schema, ::Val{:items}, val::AbstractDict, @@ -180,7 +180,13 @@ function _validate( return _additional_items(x, schema, items, additionalItems, path) end -function _validate(x::Vector, schema, ::Val{:items}, val::Vector, path::String) +function _validate( + x::AbstractVector, + schema, + ::Val{:items}, + val::AbstractVector, + path::String, +) items = fill(false, length(x)) for (i, xi) in enumerate(x) if i > length(val) @@ -196,7 +202,13 @@ function _validate(x::Vector, schema, ::Val{:items}, val::Vector, path::String) return _additional_items(x, schema, items, additionalItems, path) end -function _validate(x::Vector, schema, ::Val{:items}, val::Bool, path::String) +function _validate( + x::AbstractVector, + schema, + ::Val{:items}, + val::Bool, + path::String, +) return val || (!val && length(x) == 0) ? nothing : SingleIssue(x, path, "items", val) end @@ -223,7 +235,7 @@ _additional_items(x, schema, items, val::Nothing, path) = nothing # 9.3.1.2 function _validate( - x::Vector, + x::AbstractVector, schema, ::Val{:additionalItems}, val, @@ -235,7 +247,13 @@ end # 9.3.1.3: unevaluatedProperties # 9.3.1.4 -function _validate(x::Vector, schema, ::Val{:contains}, val, path::String) +function _validate( + x::AbstractVector, + schema, + ::Val{:contains}, + val, + path::String, +) for (i, xi) in enumerate(x) ret = _validate(xi, val, path * "[$(i)]") if ret === nothing @@ -365,7 +383,7 @@ function _validate(x, schema, ::Val{:type}, val::String, path::String) SingleIssue(x, path, "type", val) : nothing end -function _validate(x, schema, ::Val{:type}, val::Vector, path::String) +function _validate(x, schema, ::Val{:type}, val::AbstractVector, path::String) if !any(v -> _is_type(x, Val{Symbol(v)}()), val) return SingleIssue(x, path, "type", val) end @@ -528,7 +546,7 @@ end # 6.4.1 function _validate( - x::Vector, + x::AbstractVector, schema, ::Val{:maxItems}, val::Integer, @@ -539,7 +557,7 @@ end # 6.4.2 function _validate( - x::Vector, + x::AbstractVector, schema, ::Val{:minItems}, val::Integer, @@ -550,7 +568,7 @@ end # 6.4.3 function _validate( - x::Vector, + x::AbstractVector, schema, ::Val{:uniqueItems}, val::Bool, @@ -600,7 +618,7 @@ function _validate( x::AbstractDict, schema, ::Val{:required}, - val::Vector, + val::AbstractVector, path::String, ) return any(v -> !haskey(x, v), val) ? @@ -625,7 +643,11 @@ function _validate( return end -function _dependencies(x::AbstractDict, path::String, val::Union{Bool,Dict}) +function _dependencies( + x::AbstractDict, + path::String, + val::Union{Bool,AbstractDict}, +) return _validate(x, val, path) === nothing end