Exonerate
Exonerate copied to clipboard
Schema's with id or $id fail to generate valid code
Versions
I am attempting to use Exonerate 1.1.3, with Elixir 1.17.2 OTP-27
$ elixir -v
Erlang/OTP 27 [erts-15.0] [source] [64-bit] [smp:32:24] [ds:32:24:10] [async-threads:1] [jit:ns]
Elixir 1.17.2 (compiled with Erlang/OTP 27)
mix.exs:
{:exonerate, "~> 1.1.3", runtime: false},
The problem
Consider the schema at https://www.first.org/cvss/cvss-v3.0.json
When attempting to create a validation function:
defmodule Core.JSONSchema.CVSS do
require Exonerate
Exonerate.function_from_string(:def, :validate_cvss_3_0, """
... contents here ...
"""
)
end
$ mix compile
Compiling 1 file (.ex)
error: undefined function https://www.first.org/cvss/cvss-v3.0.json#/definitions/scoreType/minimum/2 (expected Core.JSONSchema.CVSS to define such a function or for it to be imported, but none are available)
│
613 │ Exonerate.function_from_string(:def, :validate_cvss_3_0, """
│ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
│
└─ lib/etc/json_schema/cvss.ex:613: Core.JSONSchema.CVSS."https://www.first.org/cvss/cvss-v3.0.json#/definitions/scoreType"/2
error: undefined function https://www.first.org/cvss/cvss-v3.0.json#/definitions/scoreType/maximum/2 (expected Core.JSONSchema.CVSS to define such a function or for it to be imported, but none are available)
│
613 │ Exonerate.function_from_string(:def, :validate_cvss_3_0, """
│ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
│
└─ lib/etc/json_schema/cvss.ex:613: Core.JSONSchema.CVSS."https://www.first.org/cvss/cvss-v3.0.json#/definitions/scoreType"/2
The generated code when using the dump: true
option shows the following (both float and integer variants):
defp https___www.first.org_cvss_cvss_v3.0.jsonat_definitions_scoreType(float, path)
when is_float(float) do
with :ok <-
https___www.first.org_cvss_cvss_v3.0.jsonat_definitions_scoreType_maximum(float, path),
:ok <-
https___www.first.org_cvss_cvss_v3.0.jsonat_definitions_scoreType_minimum(float, path) do
:ok
end
end
There are no functions generated named: https___www.first.org_cvss_cvss_v3.0.jsonat_definitions_scoreType_minimum
or https___www.first.org_cvss_cvss_v3.0.jsonat_definitions_scoreType_maximum
however there are functions entrypoint_at_definitions_scoreType_minimum
and entrypoint_at_definitions_scoreType_maximum
which indicates a problem prefixing the id on the function names.
If I remove the following "id: " line from the schema document string then it compiles successfully.
"id": "https://www.first.org/cvss/cvss-v3.0.json",
Some questions
- Why does a schema with an id generate some function names without the required id prefix?
- How would cross schema references resolve in the cache without the ids?
- What would be a strategy to handling this correctly? (Would it be better to hash the id to keep them uniform length?)
Thanks.