Reads a DMN model from the element tree of Dmn.XML into Dmn.Model structs.
The reader knows the schema (DMN 1.6, clause 13, and the schemas of 1.1 to 1.5, which are the same elements in other
namespaces) and checks what a schema would: the document is a definitions in a namespace of DMN, the elements it needs are
there, an attribute that has a fixed set of values has one of them. It stops at the first element that breaks the schema
and returns an error that names it, with its id and its line (Dmn.Error, kind :model). What it does not do is anything
that needs more than one element: it follows no reference, resolves no name, and reads no FEEL.
It reads only what is in the namespace of the document's definitions. Elements of other vocabularies (the extensionElements,
the diagram interchange DMNDI) are not read, and an attribute of another namespace is not either.
Type references
A typeRef is a string, and a string can have a prefix that the document declares: feel:string, tns:tPerson. The
reader resolves it where the prefixes are in scope, to the name that FEEL and the compiler use:
- a name of the FEEL namespace is the built-in type,
feel:stringisstring; - a name of the namespace of the document is the item definition,
tns:tPersonistPerson; - a name of the namespace of an import is
Import.tPerson(justtPersonwhen the import has no name); - a name with no prefix, or with one that is not declared, is as it is written.
Expression languages
expression_language of a literal expression or of unary tests is nil for the language of the model, which is FEEL unless
the definitions say otherwise. Dmn.Compiler decides what it can compile.
Summary
Functions
Whether a URI names FEEL (or S-FEEL, which has the same one), as the expressionLanguage of the model or of an expression:
the URI of the FEEL of a version of DMN (.../DMN/20240513/FEEL/), or the one of DMN 1.1 (.../FEEL/20140401).
Reads the root element of a document as a model.
The version of DMN that a namespace of the model belongs to, or nil for a namespace that is not one.
Functions
Whether a URI names FEEL (or S-FEEL, which has the same one), as the expressionLanguage of the model or of an expression:
the URI of the FEEL of a version of DMN (.../DMN/20240513/FEEL/), or the one of DMN 1.1 (.../FEEL/20140401).
iex> Dmn.Reader.feel_language?("https://www.omg.org/spec/DMN/20240513/FEEL/")
true
iex> Dmn.Reader.feel_language?("http://www.omg.org/spec/FEEL/20140401")
true
iex> Dmn.Reader.feel_language?("http://www.omg.org/spec/DMN/uninterpreted/20140801")
false
@spec read(Dmn.XML.Element.t()) :: {:ok, Dmn.Model.t()} | {:error, Dmn.Error.t()}
Reads the root element of a document as a model.
iex> {:ok, root} = Dmn.XML.parse(~s(<definitions xmlns="https://www.omg.org/spec/DMN/20240513/MODEL/" name="m" namespace="urn:m"/>))
iex> {:ok, model} = Dmn.Reader.read(root)
iex> {model.name, model.namespace, model.version}
{"m", "urn:m", :dmn_1_6}
@spec version(String.t() | nil) :: Dmn.Model.version() | nil
The version of DMN that a namespace of the model belongs to, or nil for a namespace that is not one.
iex> Dmn.Reader.version("https://www.omg.org/spec/DMN/20230324/MODEL/")
:dmn_1_5
iex> Dmn.Reader.version("http://www.omg.org/spec/DMN/20151101/dmn.xsd")
:dmn_1_1
iex> Dmn.Reader.version("urn:other")
nil