diff --git a/lib/rdf/xsd/datatypes/any_uri.ex b/lib/rdf/xsd/datatypes/any_uri.ex index c608b80..c9c047e 100644 --- a/lib/rdf/xsd/datatypes/any_uri.ex +++ b/lib/rdf/xsd/datatypes/any_uri.ex @@ -7,13 +7,34 @@ defmodule RDF.XSD.AnyURI do @type valid_value :: URI.t() + use RDF.XSD.Datatype.Primitive, + name: "anyURI", + id: RDF.Utils.Bootstrapping.xsd_iri("anyURI") + alias RDF.{IRI, XSD} import RDF.Guards - use XSD.Datatype.Primitive, - name: "anyURI", - id: RDF.Utils.Bootstrapping.xsd_iri("anyURI") + + def_applicable_facet XSD.Facets.MinLength + def_applicable_facet XSD.Facets.MaxLength + def_applicable_facet XSD.Facets.Length + + @doc false + def min_length_conform?(min_length, _value, lexical) do + String.length(lexical) >= min_length + end + + @doc false + def max_length_conform?(max_length, _value, lexical) do + String.length(lexical) <= max_length + end + + @doc false + def length_conform?(length, _value, lexical) do + String.length(lexical) == length + end + @impl XSD.Datatype @spec lexical_mapping(String.t(), Keyword.t()) :: valid_value diff --git a/test/unit/xsd/datatypes/any_uri_test.exs b/test/unit/xsd/datatypes/any_uri_test.exs index 2fa2aef..5ee5198 100644 --- a/test/unit/xsd/datatypes/any_uri_test.exs +++ b/test/unit/xsd/datatypes/any_uri_test.exs @@ -3,6 +3,16 @@ defmodule RDF.XSD.AnyURITest do datatype: RDF.XSD.AnyURI, name: "anyURI", primitive: true, + applicable_facets: [ + RDF.XSD.Facets.MinLength, + RDF.XSD.Facets.MaxLength, + RDF.XSD.Facets.Length, + ], + facets: %{ + max_length: nil, + min_length: nil, + length: nil, + }, valid: %{ # input => { value, lexical, canonicalized } "http://example.com/foo" =>