Skip to content

Commit 9745774

Browse files
committed
Support for unknown enum items
1 parent 4c373f9 commit 9745774

5 files changed

Lines changed: 33 additions & 19 deletions

File tree

docs_src/nfc_data_format.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
1. All data sections SHALL be at most 512 bytes long.
7878
1. All fields MUST follow this specification. Using custom or vendor-specific keys is not permitted (with the exception described in the Aux Region section).
7979
1. New keys can be added to the specification at any time, implementations SHALL be able to skip unknown keys, of any type. Unknown fields SHALL NOT be removed when updating a known field (or in any update proces in general) unless explicitly intended.
80+
1. This applies to unknown items of `enum` and `enum_array` as well, provided that they are represented as integer values in the range of <0, 65535>.
8081
1. Keys can be deprecated at any time. Deprecated keys will never be reused.
8182
1. The keys MAY be arbitrarily ordered within the CBOR map. Implementations SHALL support unsorted (non-canonical) CBOR maps.
8283
1. CBOR maps and arrays SHOULD be encoded as indefinite containers.

tests/encode_decode/05_data.bin

0 Bytes
Binary file not shown.

tests/encode_decode/05_info.yaml

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ regions:
88
payload_offset: 4
99
absolute_offset: 46
1010
size: 230
11-
used_size: 23
11+
used_size: 31
1212
aux:
1313
payload_offset: 234
1414
absolute_offset: 276
@@ -18,21 +18,24 @@ root:
1818
data_size: 312
1919
payload_size: 269
2020
overhead: 43
21-
payload_used_size: 28
22-
total_used_size: 71
21+
payload_used_size: 36
22+
total_used_size: 79
2323
data:
2424
meta:
2525
aux_region_offset: 234
2626
main:
2727
material_class: FFF
2828
transmission_distance: 5.1
29+
tags:
30+
- glitter
31+
- 9429
2932
aux: {}
3033
unknown_fields:
3134
main:
3235
19ffff: '6474657374'
3336
raw_data:
3437
meta: a10218ea
35-
main: bf0800181bfb401466666666666619ffff6474657374ff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
38+
main: bf0800181bfb4014666666666666181c9f171924d5ff19ffff6474657374ff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
3639
aux: a000000000000000000000000000000000000000000000000000000000000000000000
3740
uri: null
3841
validate:
@@ -47,7 +50,6 @@ validate:
4750
- Missing recommended field 'actual_netto_full_weight'
4851
- Missing recommended field 'empty_container_weight'
4952
- Missing recommended field 'primary_color'
50-
- Missing recommended field 'tags'
5153
- Missing recommended field 'density'
5254
- Missing recommended field 'min_print_temperature'
5355
- Missing recommended field 'max_print_temperature'

tests/encode_decode/05_input.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,12 @@ test_config:
33
data:
44
main:
55
material_class: FFF
6+
7+
# Test unknown enum items
8+
tags:
9+
- glitter
10+
- 9429
11+
612
unknown_fields:
713
main:
814
# 27 (= transmission distance): 5.1

utils/fields.py

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -129,17 +129,28 @@ def __init__(self, config, config_dir):
129129
self.items_by_key[key] = name
130130
self.items_by_name[name] = key
131131

132+
def decode(self, data):
133+
if not isinstance(data, int):
134+
raise ValueError("Enum item not integer")
135+
136+
return self.items_by_key.get(data, data)
137+
138+
def encode(self, data):
139+
if isinstance(data, str):
140+
return self.items_by_name[data]
141+
142+
elif isinstance(data, int):
143+
# Pass unkown items verbatim
144+
return data
145+
146+
else:
147+
raise ValueError("Enum values must be either")
148+
132149

133150
class EnumField(EnumFieldBase):
134151
def __init__(self, config, config_dir):
135152
super().__init__(config, config_dir)
136153

137-
def decode(self, data):
138-
return self.items_by_key[data]
139-
140-
def encode(self, data):
141-
return self.items_by_name[data]
142-
143154

144155
class EnumArrayField(EnumFieldBase):
145156
max_len: int
@@ -151,18 +162,12 @@ def __init__(self, config, config_dir):
151162
def decode(self, data):
152163
assert type(data) is list
153164

154-
result = []
155-
for item in data:
156-
result.append(self.items_by_key[item])
157-
158-
return result
165+
return [EnumFieldBase.decode(self, item) for item in data]
159166

160167
def encode(self, data):
161168
assert type(data) is list
162169

163-
result = []
164-
for item in data:
165-
result.append(self.items_by_name[item])
170+
result = [EnumFieldBase.encode(self, item) for item in data]
166171

167172
assert len(result) <= self.max_len
168173
return result

0 commit comments

Comments
 (0)