- From: Carsten Bormann <cabo@tzi.org>
- Date: Tue, 02 Aug 2016 15:52:05 +0200
- To: Poul-Henning Kamp <phk@phk.freebsd.dk>
- CC: HTTP Working Group <ietf-http-wg@w3.org>, draft-greevenbosch-appsawg-cbor-cddl@ietf.org
I don't know when Poul-Henning will catch a train the next time...
But I was interested in whether CDDL can be used as a specification
language here, because it is always good to look at more use cases.
So let's see (mostly untested at this point because I have no idea
whether anybody wants to use CDDL in this context, but examples should
work with the CDDL tool today):
> Schemas
> =======
>
> There needs a "ABNF"-parallel to specify what is mandatory and
> allowed for these headers in "common structure".
Indeed, CDDL is essentially ABNF ported to tree grammars.
The top-level data model of the proposed format could be expressed as:
header-value = [* dict-element]
dict-element = [name, value-map]
name = text ; possibly restricted
value-map = {* name => value} ; empty by default
value = text / bytes / number / time / value-map
; add as needed
> Ideally this should be in machine-readable format, so that
> validation tools and parser-code can be produced without
> (too much) human intervation. I'm tempted to say we should
> make the schemas JSON, but then we need to write JSON schemas
> for our schemas :-/
For -09, we are discussing to add a separate machine-readable (JSON)
encoding to be used by tools, in addition to the human-readable format
to be used by humans. (No intention to make both the same, that would
be a classical mistake.)
> Since schemas basically restict what you are allowed to
> express, we need to examine and think about what restrictions
> we want to be able to impose, before we design the schema.
>
> This is the least thought about part of this document, since
> the train is now in Lund:
OK, let's see what restrictions CDDL offers today (they are called
"annotations" there, a not so bright name to be changed):
> Unicode strings:
> ----------------
>
> * Limit by (UTF-8) encoded length.
> Ie: a resource restriction, not a typographical restriction.
That would be .size:
dns-label = text .size (1..63)
> * Limit by codepoints
> Example: Allow only "0-9" and "a-f"
> The specification of code-points should be list of codepoint
> ranges. (Ascii strings could be defined this way)
Today this is generally done via regexps.
> * Limit by allowed strings
> ie: Allow only "North", "South", "East" and "West"
Those are typically done constructively:
direction = "North" / "South" / "East" / "West"
Of course, regexps can do that, too, if needed.
> Tokens
> ------
>
> * Limit by codepoints
> Example: Allow only "A-Z"
token1 = text .regexp "[A-Z]"
> * Limit by length
> Example: Max 7 characters
CDDL can only count characters (as opposed to bytes) employing regexps
right now.
Another extension may be needed if there indeed is a good use case for
counting characters.
> * Limit by pattern
> Example: "A-Z" "a-z" "-" "0-9" "0-9"
> (use ABNF to specify ?)
(Regexps, again)
> * Limit by well known set
> Example: Token must be ISO3166-1 country code
> Example: Token must be in IANA FooBar registry
Interesting. There currently is no formal interface to IANA (or ISO)
registries; we don't have an informal escape like ABNF has in prose-val.
"Annotations" could be added as needed and they are close.
> Qualified Tokens
> ----------------
>
> * Limit each of the two component tokens as above.
>
> Binary Blob
> -----------
>
> * Limit by length in bytes
> Example: 128 bytes
> Example: 16-64 or 80 bytes
blob1 = bytes .size (16..64 / 80)
> Number
> ------
>
> * Limit resolution
> Example: exactly 3 decimal digits
Would need a new CDDL "annotation", say
q = number .decimals 3
> * Limit range
> Example: [2.716 ... 3.1415]
etopi = 2.718..3.1415
> Integer
> -------
>
> * Limit range
> Example [0 ... 65535]
ex1 = 0..65535
ex2 = uint .size 2
> Timestamp
> ---------
>
> (I cant thing of usable restrictions here)
ts = uint ; (or whatever type of timestamp you want;
; `time` as a POSIX time and RFC3339 dates are built in)
Grüße, Carsten
Received on Tuesday, 2 August 2016 13:52:35 UTC