cddl 0.6.2 → 0.6.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/cddl +35 -3
- data/cddl.gemspec +1 -1
- data/data/prelude.cddl +1 -1
- data/lib/cbor-pp-play.rb +13 -0
- data/lib/cbor-pp.rb +180 -0
- data/lib/cddl.rb +101 -35
- data/test-data/dcaf.cddl +58 -0
- data/test-data/grasp-v1.cddl +97 -0
- data/test-data/grasp-v2X.cddl +89 -0
- data/test-data/ifmap-base-2.2v9_fh-cabo.cddl +149 -0
- data/test-data/ifmap-metadata-2.2v9_fh-cabo.cddl +239 -0
- data/test/test-cddl.rb +68 -6
- metadata +10 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7ed6608fc505b18aec7d8e30bac4b1faca1265da
|
4
|
+
data.tar.gz: 46a78ea14fc09cc01a56ca63320e2f8a9de175d3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c941909e3cf4064ae0fbcb3f94e8bb54a10da19c294f1b6a7d5152cb0dd653a7ac6652f11bddc3d2a0e30a8679e823585b235acdf3479e660a66ba33b793e069
|
7
|
+
data.tar.gz: 2dd6ad6d49ab40dc1ccba874ee722aa3e490075886f8af51255ad33b5656c0b5c009f326727689f36f0ebd2cc7a30944e69209c6340fead7277a8294dc2878ba
|
data/bin/cddl
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# -*- coding: utf-8 -*-
|
3
|
+
# require_relative '../lib/cddl'
|
3
4
|
require 'cddl'
|
4
5
|
require 'cbor-diagnostic'
|
5
6
|
require 'json'
|
@@ -28,17 +29,44 @@ def parser
|
|
28
29
|
@parser ||= CDDL::Parser.new(read_arg(ARGV[0]))
|
29
30
|
end
|
30
31
|
|
32
|
+
def my_pp(v)
|
33
|
+
if $annotate
|
34
|
+
CBOR::PP.pp v
|
35
|
+
else
|
36
|
+
pp v
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def my_diag(v)
|
41
|
+
if $annotate
|
42
|
+
CBOR::PP.pp v
|
43
|
+
else
|
44
|
+
puts v.cbor_diagnostic
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
31
48
|
begin
|
49
|
+
case ARGV[1]
|
50
|
+
when /\A.p/
|
51
|
+
$annotate = true
|
52
|
+
require_relative '../lib/cbor-pp'
|
53
|
+
end
|
32
54
|
case ARGV[1]
|
33
55
|
when /\Ar/ # secret
|
34
56
|
$advanced = true
|
35
|
-
|
57
|
+
my_pp parser.rules
|
36
58
|
when /\Ag/
|
37
59
|
n = 1
|
38
60
|
n = ARGV[2].to_i if ARGV[2]
|
39
61
|
n.times do
|
40
62
|
g = parser.generate
|
41
|
-
|
63
|
+
if $annotate
|
64
|
+
g = g.cbor_clone if ENV["EXPERIMENTAL_ANNOTATE"]
|
65
|
+
ann = parser.validate(g)
|
66
|
+
# my_pp ann
|
67
|
+
g.cbor_add_annotations_from(ann) rescue nil
|
68
|
+
end
|
69
|
+
my_diag(g)
|
42
70
|
end
|
43
71
|
when /\Aj/
|
44
72
|
n = 1
|
@@ -50,7 +78,11 @@ begin
|
|
50
78
|
when /\Av/
|
51
79
|
instance = read_arg(ARGV[2])
|
52
80
|
instance = CBOR.decode(instance.b) rescue JSON.load(instance)
|
53
|
-
|
81
|
+
instance = instance.cbor_clone if $annotate && ENV["EXPERIMENTAL_ANNOTATE"]
|
82
|
+
ann = parser.validate(instance)
|
83
|
+
# my_pp ann
|
84
|
+
instance.cbor_add_annotations_from(ann) rescue nil
|
85
|
+
my_diag(instance) if $annotate
|
54
86
|
else
|
55
87
|
usage
|
56
88
|
end
|
data/cddl.gemspec
CHANGED
data/data/prelude.cddl
CHANGED
@@ -11,7 +11,7 @@ bytes = bstr
|
|
11
11
|
tstr = #3
|
12
12
|
text = tstr
|
13
13
|
|
14
|
-
tdate = #6.0(tstr)
|
14
|
+
tdate = #6.0(tstr .regexp "\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2]\\d|3[0-1])[Tt]([0-1]\\d|2[0-3]):([0-5]\\d):([0-5]\\d)(\\.\\d+)?([Zz]|[+\\-](?:[0-1]\\d|2[0-3]):[0-5]\\d)")
|
15
15
|
time = #6.1(number)
|
16
16
|
number = int / float
|
17
17
|
biguint = #6.2(bstr)
|
data/lib/cbor-pp-play.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require_relative "cbor-pp"
|
2
|
+
|
3
|
+
a = [1, {foo: "bar", busel: "basel", baz: "bass", ant: "cat", bat: "dog", eel: "fox"},
|
4
|
+
2, 3, 4, [3]*55, "foo".b, 0.00006103515625, 0.0000099, 1e-7, nil]
|
5
|
+
a[1].cbor_annotation_add "fasel"
|
6
|
+
CBOR::PP.pp a
|
7
|
+
|
8
|
+
a = [1, "baz", 3]
|
9
|
+
a.cbor_annotation_add "foo"
|
10
|
+
a[1].cbor_annotation_add "bar"
|
11
|
+
CBOR::PP.pp(a)
|
12
|
+
|
13
|
+
p 1.cbor_annotation_format
|
data/lib/cbor-pp.rb
ADDED
@@ -0,0 +1,180 @@
|
|
1
|
+
require 'prettyprint'
|
2
|
+
require 'cbor-diagnostic'
|
3
|
+
require 'delegate'
|
4
|
+
|
5
|
+
class CBOR::PP < PrettyPrint
|
6
|
+
# Outputs +obj+ to +out+ in pretty printed format of
|
7
|
+
# +width+ columns in width.
|
8
|
+
#
|
9
|
+
# If +out+ is omitted, <code>$></code> is assumed.
|
10
|
+
# If +width+ is omitted, 79 is assumed.
|
11
|
+
#
|
12
|
+
# CBOR::PP.pp returns +out+.
|
13
|
+
def self.pp(obj, out=$>, width=79)
|
14
|
+
q = new(out, width)
|
15
|
+
q.pp obj
|
16
|
+
q.flush
|
17
|
+
#$pp = q
|
18
|
+
out << "\n"
|
19
|
+
end
|
20
|
+
|
21
|
+
module PPMethods
|
22
|
+
# Adds +obj+ to the pretty printing buffer
|
23
|
+
# using Object#cbor_pp.
|
24
|
+
def pp(obj)
|
25
|
+
group {obj.cbor_pp self}
|
26
|
+
end
|
27
|
+
|
28
|
+
# XXX: a nested group that is broken should not have things added at the end
|
29
|
+
def comma_breakable
|
30
|
+
text ','
|
31
|
+
fill_breakable
|
32
|
+
end
|
33
|
+
|
34
|
+
def seplist(list, sep=nil, iter_method=:each) # :yield: element
|
35
|
+
sep ||= lambda { comma_breakable }
|
36
|
+
first = true
|
37
|
+
list.__send__(iter_method) {|*v|
|
38
|
+
if first
|
39
|
+
first = false
|
40
|
+
else
|
41
|
+
sep.call
|
42
|
+
end
|
43
|
+
yield(*v)
|
44
|
+
}
|
45
|
+
end
|
46
|
+
|
47
|
+
# A pretty print for a Hash
|
48
|
+
def pp_hash(obj, anno)
|
49
|
+
s = "#{anno}{"
|
50
|
+
group(1, s, '}') {
|
51
|
+
seplist(obj, nil, :each_pair) {|k, v|
|
52
|
+
group {
|
53
|
+
pp k
|
54
|
+
text ':'
|
55
|
+
group(1) {
|
56
|
+
breakable ' '
|
57
|
+
pp v
|
58
|
+
}
|
59
|
+
}
|
60
|
+
}
|
61
|
+
}
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
include PPMethods
|
66
|
+
|
67
|
+
module ObjectMixin # :nodoc:
|
68
|
+
def cbor_pp(q)
|
69
|
+
if @cbor_annotation
|
70
|
+
q.text cbor_annotation_format
|
71
|
+
end
|
72
|
+
q.text cbor_diagnostic
|
73
|
+
end
|
74
|
+
def cbor_annotation_add(v)
|
75
|
+
unless frozen?
|
76
|
+
@cbor_annotation ||= []
|
77
|
+
@cbor_annotation << v unless @cbor_annotation.include? v
|
78
|
+
end
|
79
|
+
end
|
80
|
+
def cbor_annotation_replace(v)
|
81
|
+
@cbor_annotation = [v]
|
82
|
+
end
|
83
|
+
def cbor_annotations
|
84
|
+
@cbor_annotation
|
85
|
+
end
|
86
|
+
def cbor_annotation_format
|
87
|
+
if @cbor_annotation
|
88
|
+
"/" << @cbor_annotation.join(", ") << "/ "
|
89
|
+
end
|
90
|
+
end
|
91
|
+
def cbor_add_annotations_from(ann_list)
|
92
|
+
_data, anno = ann_list.find{|data, _anno| equal?(data)}
|
93
|
+
f = anno.cbor_annotations
|
94
|
+
f.each {|a| cbor_annotation_add(a)} if f
|
95
|
+
end
|
96
|
+
def cbor_clone
|
97
|
+
if frozen?
|
98
|
+
CBOR::PP::Cloak.new(self)
|
99
|
+
else
|
100
|
+
self
|
101
|
+
end
|
102
|
+
end
|
103
|
+
def eql?(other)
|
104
|
+
if other.respond_to? :__getobj__
|
105
|
+
eql? other.__getobj__
|
106
|
+
else
|
107
|
+
super
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def self.add_annotations(tree, ann_list)
|
113
|
+
tree.cbor_add_annotations_from(ann_list)
|
114
|
+
end
|
115
|
+
|
116
|
+
class Cloak < ::SimpleDelegator
|
117
|
+
def class
|
118
|
+
@delegate_sd_obj.class
|
119
|
+
end
|
120
|
+
include CBOR::PP::ObjectMixin
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
class Class
|
125
|
+
def ===(other)
|
126
|
+
if other.respond_to? :__getobj__
|
127
|
+
other.__getobj__.kind_of? self
|
128
|
+
else
|
129
|
+
other.kind_of? self
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
class Array # :nodoc:
|
135
|
+
def cbor_pp(q) # :nodoc:
|
136
|
+
s = "#{cbor_annotation_format}["
|
137
|
+
q.group(1, s, ']') {
|
138
|
+
q.seplist(self) {|v|
|
139
|
+
q.pp v
|
140
|
+
}
|
141
|
+
}
|
142
|
+
end
|
143
|
+
def cbor_add_annotations_from(ann_list)
|
144
|
+
super
|
145
|
+
each {|m| m.cbor_add_annotations_from(ann_list)}
|
146
|
+
end
|
147
|
+
def cbor_clone
|
148
|
+
map(&:cbor_clone)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
class Hash # :nodoc:
|
153
|
+
def cbor_pp(q) # :nodoc:
|
154
|
+
q.pp_hash self, cbor_annotation_format
|
155
|
+
end
|
156
|
+
def cbor_add_annotations_from(ann_list)
|
157
|
+
super
|
158
|
+
each {|k, v|
|
159
|
+
# k.cbor_add_annotations_from(ann_list)
|
160
|
+
v.cbor_add_annotations_from(ann_list)
|
161
|
+
}
|
162
|
+
end
|
163
|
+
def cbor_clone
|
164
|
+
to_a.cbor_clone.to_h
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
class Numeric
|
169
|
+
def eql?(other)
|
170
|
+
if other.respond_to? :__getobj__
|
171
|
+
eql? other.__getobj__
|
172
|
+
else
|
173
|
+
super
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
class Object < BasicObject # :nodoc:
|
179
|
+
include CBOR::PP::ObjectMixin
|
180
|
+
end
|
data/lib/cddl.rb
CHANGED
@@ -377,10 +377,10 @@ module CDDL
|
|
377
377
|
|
378
378
|
def validate(d, warn=true)
|
379
379
|
@recursion = 0
|
380
|
-
result =
|
380
|
+
result = validate1a(d, rules)
|
381
381
|
unless result
|
382
382
|
if warn
|
383
|
-
warn "CDDL validation failure:"
|
383
|
+
warn "CDDL validation failure (#{result.inspect} for #{d.inspect}):"
|
384
384
|
PP::pp(validate_diag, STDERR)
|
385
385
|
end
|
386
386
|
end
|
@@ -395,60 +395,72 @@ module CDDL
|
|
395
395
|
end
|
396
396
|
|
397
397
|
def validate_forward(d, start, where)
|
398
|
+
# warn ["valforw", d, start, where].inspect
|
398
399
|
i = 0
|
400
|
+
ann = []
|
399
401
|
where[1..-1].each { |r|
|
400
402
|
t, s, e, _k, v = r # XXX
|
401
403
|
if t == :recurse_grpent
|
402
404
|
rule = lookup_recurse_grpent(s)
|
403
|
-
n = validate_linear(d, start+i, rule)
|
404
|
-
return false unless n
|
405
|
+
n, ann2 = validate_linear(d, start+i, rule)
|
406
|
+
return [false, ann] unless n
|
405
407
|
i += n
|
408
|
+
ann.concat(ann2)
|
406
409
|
elsif t == :grpchoice
|
407
|
-
return false unless r[1..-1].any? {|cand|
|
408
|
-
|
410
|
+
return [false, ann] unless r[1..-1].any? {|cand|
|
411
|
+
n, ann2 = validate_forward(d, start+i, [:foo, *cand])
|
412
|
+
if n
|
409
413
|
i += n
|
414
|
+
ann.concat(ann2)
|
410
415
|
end}
|
411
416
|
else
|
412
417
|
fail r.inspect unless t == :member
|
413
418
|
occ = 0
|
414
|
-
while ((occ < e) && i != d.size && (n = validate_linear(d, start+i, v)))
|
419
|
+
while ((occ < e) && i != d.size && ((n, ann2 = validate_linear(d, start+i, v)); n))
|
415
420
|
i += n
|
416
421
|
occ += 1
|
422
|
+
ann.concat(ann2)
|
417
423
|
end
|
418
424
|
if occ < s
|
419
425
|
@last_message = "occur not reached in array #{d} for #{where}"
|
420
|
-
return false
|
426
|
+
return [false, ann]
|
421
427
|
end
|
422
428
|
end
|
423
429
|
}
|
424
|
-
i
|
430
|
+
# warn ["valforw>", i].inspect
|
431
|
+
[i, ann]
|
425
432
|
end
|
426
433
|
|
427
434
|
# returns number of matches or false for breakage
|
428
435
|
def validate_linear(d, start, where)
|
436
|
+
# warn ["vallin", d, start, where].inspect
|
429
437
|
fail unless Array === d
|
430
438
|
case where[0]
|
431
439
|
when :grpent
|
432
440
|
# must be inside an array with nested occurrences
|
433
441
|
validate_forward(d, start, where)
|
434
442
|
else
|
435
|
-
|
443
|
+
(ann = validate1a(d[start], where)) ? [1, ann] : [false, ann]
|
436
444
|
end
|
437
445
|
end
|
438
446
|
|
439
447
|
def map_check(d, d_check, members)
|
440
|
-
|
448
|
+
anno = []
|
449
|
+
anno if members.all? { |r|
|
441
450
|
# puts "SUBRULE: #{r.inspect}"
|
442
|
-
t, s,
|
451
|
+
t, s, e, k, v = r
|
443
452
|
case t
|
444
453
|
when :recurse_grpent
|
445
454
|
rule = lookup_recurse_grpent(s)
|
446
|
-
map_check(d, d_check, rule[1..-1])
|
455
|
+
if ann2 = map_check(d, d_check, rule[1..-1])
|
456
|
+
anno.concat(ann2)
|
457
|
+
end
|
447
458
|
when :grpchoice
|
448
459
|
r[1..-1].any? {|cand|
|
449
460
|
cand_d_check = d_check.dup
|
450
|
-
if map_check(d, cand_d_check, cand)
|
461
|
+
if ann2 = map_check(d, cand_d_check, cand)
|
451
462
|
d_check.replace(cand_d_check)
|
463
|
+
anno.concat(ann2)
|
452
464
|
end
|
453
465
|
}
|
454
466
|
when :member
|
@@ -462,8 +474,20 @@ module CDDL
|
|
462
474
|
fail "member name not known for group entry #{r} in map"
|
463
475
|
end
|
464
476
|
d_check1 = d_check.dup
|
465
|
-
|
466
|
-
|
477
|
+
occ = 0
|
478
|
+
ann2 = []
|
479
|
+
while occ < e && (ann3 = map_check(d, d_check1, entries))
|
480
|
+
occ += 1
|
481
|
+
ann2.concat(ann3)
|
482
|
+
end
|
483
|
+
if occ >= s
|
484
|
+
d_check.replace(d_check1)
|
485
|
+
anno.concat(ann2)
|
486
|
+
return anno
|
487
|
+
else
|
488
|
+
# leave some diagnostic breadcrumbs?
|
489
|
+
return false
|
490
|
+
end
|
467
491
|
end
|
468
492
|
# this is mostly quadratic; let's do the linear thing if possible
|
469
493
|
simple, simpleval = extract_value(k)
|
@@ -474,7 +498,10 @@ module CDDL
|
|
474
498
|
if actual == :not_found
|
475
499
|
s == 0 # minimum occurrence must be 0 then
|
476
500
|
else
|
477
|
-
|
501
|
+
if (ann2 = validate1a(actual, v)) &&
|
502
|
+
d_check.delete(simpleval) {:not_found} != :not_found
|
503
|
+
anno.concat(ann2)
|
504
|
+
end
|
478
505
|
end
|
479
506
|
else
|
480
507
|
# puts "COMPLEX: #{k.inspect} #{simple.inspect} #{simpleval.inspect}"
|
@@ -482,7 +509,10 @@ module CDDL
|
|
482
509
|
ta, keys = keys.partition{ |key| validate1(key, k)}
|
483
510
|
# XXX check ta.size against s/e
|
484
511
|
ta.all? { |val|
|
485
|
-
|
512
|
+
if (ann2 = validate1a(d[val], v)) &&
|
513
|
+
d_check.delete(val) {:not_found} != :not_found
|
514
|
+
anno.concat(ann2)
|
515
|
+
end
|
486
516
|
}
|
487
517
|
end
|
488
518
|
else
|
@@ -491,42 +521,60 @@ module CDDL
|
|
491
521
|
}
|
492
522
|
end
|
493
523
|
|
494
|
-
def
|
524
|
+
def validate1a(d, where)
|
525
|
+
if ann = validate1(d, where)
|
526
|
+
here = [d, where]
|
527
|
+
if Array === ann
|
528
|
+
[here, *ann]
|
529
|
+
else
|
530
|
+
[here]
|
531
|
+
end
|
532
|
+
end
|
533
|
+
end
|
534
|
+
|
535
|
+
def validate1(d, where)
|
495
536
|
# puts "DATA: #{d.inspect}"
|
496
537
|
# puts "RULE: #{where.inspect}"
|
538
|
+
# warn ["val1", d, where].inspect
|
497
539
|
@last_data = d
|
498
540
|
@last_rule = where
|
541
|
+
ann = nil
|
499
542
|
case where[0]
|
500
543
|
when :type1
|
501
|
-
where[1..-1].any? {|r|
|
544
|
+
if where[1..-1].any? {|r| ann = validate1a(d, r)}
|
545
|
+
ann
|
546
|
+
end
|
502
547
|
when :map
|
503
548
|
if Hash === d
|
504
549
|
d_check = d.dup
|
505
|
-
map_check(d, d_check, where[1..-1]) && d_check == {}
|
550
|
+
if (ann = map_check(d, d_check, where[1..-1])) && d_check == {}
|
551
|
+
ann
|
552
|
+
end
|
506
553
|
end
|
507
554
|
when :array
|
555
|
+
# warn ["valarr", d, where].inspect
|
508
556
|
if Array === d
|
509
557
|
# validate1 against the record
|
510
|
-
idx = validate_forward(d, 0, where)
|
511
|
-
validate_result(idx == d.size) { "cannot complete array #{d} for #{where}" }
|
558
|
+
idx, ann = validate_forward(d, 0, where)
|
559
|
+
ann if validate_result(idx == d.size) { "cannot complete array #{d} for #{where}" }
|
512
560
|
end
|
513
561
|
when :string, :int, :float
|
514
562
|
_, v = extract_value(where)
|
515
|
-
d == v
|
563
|
+
[] if d == v
|
516
564
|
when :range
|
517
|
-
where[2] === d && where[1].include?(d)
|
565
|
+
[] if where[2] === d && where[1].include?(d)
|
518
566
|
when :anno
|
519
567
|
target = where[2]
|
520
|
-
if
|
568
|
+
if ann = validate1a(d, target)
|
521
569
|
control = where[3]
|
522
570
|
case where[1]
|
523
571
|
when :size
|
524
|
-
validate1(d.bytesize, control)
|
572
|
+
ann if validate1(d.bytesize, control)
|
525
573
|
when :bits
|
526
574
|
if String === d
|
527
575
|
d.each_byte.with_index.all? { |b, i|
|
528
576
|
bit = i << 3
|
529
|
-
8.times.all? { |nb|
|
577
|
+
ann if 8.times.all? { |nb|
|
530
578
|
b[nb] == 0 || validate1(bit+nb, control)
|
531
579
|
}
|
532
580
|
}
|
@@ -540,10 +588,11 @@ module CDDL
|
|
540
588
|
end
|
541
589
|
d >>= 1; i += 1
|
542
590
|
end
|
543
|
-
ok
|
591
|
+
ann if ok
|
544
592
|
end
|
545
593
|
end
|
546
594
|
when :regexp
|
595
|
+
ann if (
|
547
596
|
if String === d
|
548
597
|
ok, v, vt = extract_value(control)
|
549
598
|
if ok && vt == String
|
@@ -552,6 +601,7 @@ module CDDL
|
|
552
601
|
d.match(re)
|
553
602
|
end
|
554
603
|
end
|
604
|
+
)
|
555
605
|
else
|
556
606
|
fail "Don't know yet how to validate against #{where}"
|
557
607
|
end
|
@@ -570,7 +620,7 @@ module CDDL
|
|
570
620
|
when 3
|
571
621
|
String === d && d.encoding != Encoding::BINARY # cheat
|
572
622
|
when 6
|
573
|
-
CBOR::Tagged === d && d.tag == where[2] &&
|
623
|
+
CBOR::Tagged === d && d.tag == where[2] && validate1a(d.data, where[3])
|
574
624
|
when 7
|
575
625
|
t, v = extract_value(where)
|
576
626
|
if t
|
@@ -594,13 +644,15 @@ module CDDL
|
|
594
644
|
rule = @stage1[name]
|
595
645
|
if @recursion < MAX_RECURSE
|
596
646
|
@recursion += 1
|
597
|
-
r =
|
647
|
+
r = validate1a(d, rule)
|
598
648
|
@recursion -= 1
|
599
649
|
r
|
600
650
|
else
|
601
651
|
fail "Deep recursion into #{name}: #{rule}, not yet implemented"
|
602
652
|
end
|
603
653
|
else
|
654
|
+
@last_message = "Don't know how to validate #{where}"
|
655
|
+
false
|
604
656
|
# fail where
|
605
657
|
end
|
606
658
|
end
|
@@ -671,6 +723,7 @@ module CDDL
|
|
671
723
|
fail t
|
672
724
|
end}]
|
673
725
|
@bindings.pop
|
726
|
+
r.cbor_annotation_add(n) rescue nil # AAA
|
674
727
|
r
|
675
728
|
end
|
676
729
|
end
|
@@ -729,7 +782,10 @@ module CDDL
|
|
729
782
|
else
|
730
783
|
t = if nbw = nt.bareword
|
731
784
|
t1 = nbw.type1 # || n.bareword.s.type.type1 # workaround
|
732
|
-
|
785
|
+
rest = type_collect(nt, true)
|
786
|
+
s = [:type1, type1(t1, true), *rest]
|
787
|
+
# warn "T2: #{s.size} #{s}" -- maybe this should have a parenthesis warning?
|
788
|
+
s.size == 2 ? s[1] : s # decapsulate single-element choice
|
733
789
|
else
|
734
790
|
type(nt, true) # type can actually be a group here!
|
735
791
|
end
|
@@ -767,6 +823,9 @@ module CDDL
|
|
767
823
|
if occ[0] == 0 && t == [:grpchoice]
|
768
824
|
[] # we won't be able to generate any of those
|
769
825
|
else
|
826
|
+
if t[0] == :grpchoice # FIXME: need to package grpchoice into grpent in a member
|
827
|
+
t = [:grpent, t]
|
828
|
+
end
|
770
829
|
[[:member, *occ, nil, t]]
|
771
830
|
end
|
772
831
|
end
|
@@ -790,7 +849,7 @@ module CDDL
|
|
790
849
|
elsif !genericargs && (t = rule_lookup(name, canbegroup))
|
791
850
|
t
|
792
851
|
else
|
793
|
-
fail "Unknown type #{name} #{genericargs.inspect} #{@bindings}
|
852
|
+
fail "Unknown type #{name} #{genericargs.inspect} #{@bindings}" #{@abnf.ast?}"
|
794
853
|
end
|
795
854
|
end
|
796
855
|
|
@@ -801,7 +860,7 @@ module CDDL
|
|
801
860
|
g[1..-1]
|
802
861
|
elsif !genericargs && (g = rule_lookup(name, true))
|
803
862
|
fail "#{name} not a group" unless g[0] == :grpent
|
804
|
-
g[1..-1]
|
863
|
+
g[1..-1] # AAA
|
805
864
|
else
|
806
865
|
fail "Unknown group #{name}"
|
807
866
|
end
|
@@ -829,6 +888,8 @@ module CDDL
|
|
829
888
|
|
830
889
|
end
|
831
890
|
end # XXX should flatten the thing, too
|
891
|
+
t = t.dup
|
892
|
+
t.cbor_annotation_replace(v.to_s) rescue nil # AAA
|
832
893
|
t
|
833
894
|
else
|
834
895
|
fail [n, n.children].inspect
|
@@ -911,6 +972,7 @@ module CDDL
|
|
911
972
|
[:type1, *s.map {|mem|
|
912
973
|
t, _s, _e, _k, v = mem
|
913
974
|
fail "enum #{t.inspect}" unless t == :member
|
975
|
+
v.cbor_annotation_add(generate1(_k)) rescue nil # AAA (XXX: what if more than one?)
|
914
976
|
v
|
915
977
|
}
|
916
978
|
]
|
@@ -920,9 +982,13 @@ module CDDL
|
|
920
982
|
end
|
921
983
|
end
|
922
984
|
|
985
|
+
def type_collect(n, canbegroup)
|
986
|
+
n.children(:type1).map {|ch| type1(ch, canbegroup)}
|
987
|
+
end
|
988
|
+
|
923
989
|
def type(n, canbegroup = false)
|
924
990
|
# pp ["nch", n.children]
|
925
|
-
s = n
|
991
|
+
s = type_collect(n, canbegroup)
|
926
992
|
if s.size == 1
|
927
993
|
s.first
|
928
994
|
else
|