|
20 | 20 | # See the License for the specific language governing permissions and |
21 | 21 | # limitations under the License. |
22 | 22 | # ----------------------------------------------------------------------------- |
23 | | -import ndn.encoding as enc |
| 23 | +import dataclasses as dc |
| 24 | +from typing import Optional |
| 25 | + |
| 26 | +from ...encoding import BinaryStr |
| 27 | +from ...encoding.tlv_model_v2 import tlv_encode, tlv_parse |
24 | 28 |
|
25 | 29 |
|
26 | 30 | __all__ = [ |
@@ -62,63 +66,101 @@ class TypeNumber: |
62 | 66 | NAMED_PATTERN_NUM = 0x69 |
63 | 67 |
|
64 | 68 |
|
65 | | -class UserFnArg(enc.TlvModel): |
| 69 | +@dc.dataclass |
| 70 | +class UserFnArg: |
66 | 71 | # A given component |
67 | | - value = enc.BytesField(TypeNumber.COMPONENT_VALUE) |
| 72 | + value: Optional[bytes] = dc.field( |
| 73 | + default=None, metadata={'tlv_type': TypeNumber.COMPONENT_VALUE}) |
68 | 74 | # Referring to a previous matched pattern |
69 | | - tag = enc.UintField(TypeNumber.PATTERN_TAG) |
| 75 | + tag: Optional[int] = dc.field( |
| 76 | + default=None, metadata={'tlv_type': TypeNumber.PATTERN_TAG}) |
70 | 77 |
|
71 | 78 |
|
72 | | -class UserFnCall(enc.TlvModel): |
73 | | - fn_id = enc.BytesField(TypeNumber.USER_FN_ID, is_string=True) |
74 | | - args = enc.RepeatedField(enc.ModelField(TypeNumber.FN_ARGS, UserFnArg)) |
| 79 | +@dc.dataclass |
| 80 | +class UserFnCall: |
| 81 | + fn_id: Optional[str] = dc.field( |
| 82 | + default=None, metadata={'tlv_type': TypeNumber.USER_FN_ID}) |
| 83 | + args: list[UserFnArg] = dc.field( |
| 84 | + default_factory=list, metadata={'tlv_type': TypeNumber.FN_ARGS}) |
75 | 85 |
|
76 | 86 |
|
77 | | -class ConstraintOption(enc.TlvModel): |
| 87 | +@dc.dataclass |
| 88 | +class ConstraintOption: |
78 | 89 | # Equal to a given NameComponent value |
79 | | - value = enc.BytesField(TypeNumber.COMPONENT_VALUE) |
| 90 | + value: Optional[bytes] = dc.field( |
| 91 | + default=None, metadata={'tlv_type': TypeNumber.COMPONENT_VALUE}) |
80 | 92 | # Equal to another pattern |
81 | | - tag = enc.UintField(TypeNumber.PATTERN_TAG) |
| 93 | + tag: Optional[int] = dc.field( |
| 94 | + default=None, metadata={'tlv_type': TypeNumber.PATTERN_TAG}) |
82 | 95 | # Decide by a user function call |
83 | | - fn = enc.ModelField(TypeNumber.USER_FN_CALL, UserFnCall) |
84 | | - |
85 | | - |
86 | | -class PatternConstraint(enc.TlvModel): |
87 | | - options = enc.RepeatedField( |
88 | | - enc.ModelField(TypeNumber.CONS_OPTION, ConstraintOption) |
89 | | - ) |
90 | | - |
91 | | - |
92 | | -class PatternEdge(enc.TlvModel): |
93 | | - dest = enc.UintField(TypeNumber.NODE_ID) |
94 | | - tag = enc.UintField(TypeNumber.PATTERN_TAG) |
95 | | - cons_sets = enc.RepeatedField( |
96 | | - enc.ModelField(TypeNumber.CONSTRAINT, PatternConstraint) |
97 | | - ) |
98 | | - |
99 | | - |
100 | | -class ValueEdge(enc.TlvModel): |
101 | | - dest = enc.UintField(TypeNumber.NODE_ID) |
102 | | - value = enc.BytesField(TypeNumber.COMPONENT_VALUE) |
103 | | - |
104 | | - |
105 | | -class Node(enc.TlvModel): |
106 | | - id = enc.UintField(TypeNumber.NODE_ID) |
107 | | - parent = enc.UintField(TypeNumber.PARENT_ID) |
108 | | - rule_name = enc.RepeatedField(enc.BytesField(TypeNumber.IDENTIFIER, is_string=True)) |
109 | | - v_edges = enc.RepeatedField(enc.ModelField(TypeNumber.VALUE_EDGE, ValueEdge)) |
110 | | - p_edges = enc.RepeatedField(enc.ModelField(TypeNumber.PATTERN_EDGE, PatternEdge)) |
111 | | - sign_cons = enc.RepeatedField(enc.UintField(TypeNumber.KEY_NODE_ID)) |
112 | | - |
113 | | - |
114 | | -class TagSymbol(enc.TlvModel): |
115 | | - tag = enc.UintField(TypeNumber.PATTERN_TAG) |
116 | | - ident = enc.BytesField(TypeNumber.IDENTIFIER, is_string=True) |
117 | | - |
118 | | - |
119 | | -class LvsModel(enc.TlvModel): |
120 | | - version = enc.UintField(TypeNumber.VERSION) |
121 | | - start_id = enc.UintField(TypeNumber.NODE_ID) |
122 | | - named_pattern_cnt = enc.UintField(TypeNumber.NAMED_PATTERN_NUM) |
123 | | - nodes = enc.RepeatedField(enc.ModelField(TypeNumber.NODE, Node)) |
124 | | - symbols = enc.RepeatedField(enc.ModelField(TypeNumber.TAG_SYMBOL, TagSymbol)) |
| 96 | + fn: Optional[UserFnCall] = dc.field( |
| 97 | + default=None, metadata={'tlv_type': TypeNumber.USER_FN_CALL}) |
| 98 | + |
| 99 | + |
| 100 | +@dc.dataclass |
| 101 | +class PatternConstraint: |
| 102 | + options: list[ConstraintOption] = dc.field( |
| 103 | + default_factory=list, metadata={'tlv_type': TypeNumber.CONS_OPTION}) |
| 104 | + |
| 105 | + |
| 106 | +@dc.dataclass |
| 107 | +class PatternEdge: |
| 108 | + dest: Optional[int] = dc.field( |
| 109 | + default=None, metadata={'tlv_type': TypeNumber.NODE_ID}) |
| 110 | + tag: Optional[int] = dc.field( |
| 111 | + default=None, metadata={'tlv_type': TypeNumber.PATTERN_TAG}) |
| 112 | + cons_sets: list[PatternConstraint] = dc.field( |
| 113 | + default_factory=list, metadata={'tlv_type': TypeNumber.CONSTRAINT}) |
| 114 | + |
| 115 | + |
| 116 | +@dc.dataclass |
| 117 | +class ValueEdge: |
| 118 | + dest: Optional[int] = dc.field( |
| 119 | + default=None, metadata={'tlv_type': TypeNumber.NODE_ID}) |
| 120 | + value: Optional[bytes] = dc.field( |
| 121 | + default=None, metadata={'tlv_type': TypeNumber.COMPONENT_VALUE}) |
| 122 | + |
| 123 | + |
| 124 | +@dc.dataclass |
| 125 | +class Node: |
| 126 | + id: Optional[int] = dc.field( |
| 127 | + default=None, metadata={'tlv_type': TypeNumber.NODE_ID}) |
| 128 | + parent: Optional[int] = dc.field( |
| 129 | + default=None, metadata={'tlv_type': TypeNumber.PARENT_ID}) |
| 130 | + rule_name: list[str] = dc.field( |
| 131 | + default_factory=list, metadata={'tlv_type': TypeNumber.IDENTIFIER}) |
| 132 | + v_edges: list[ValueEdge] = dc.field( |
| 133 | + default_factory=list, metadata={'tlv_type': TypeNumber.VALUE_EDGE}) |
| 134 | + p_edges: list[PatternEdge] = dc.field( |
| 135 | + default_factory=list, metadata={'tlv_type': TypeNumber.PATTERN_EDGE}) |
| 136 | + sign_cons: list[int] = dc.field( |
| 137 | + default_factory=list, metadata={'tlv_type': TypeNumber.KEY_NODE_ID}) |
| 138 | + |
| 139 | + |
| 140 | +@dc.dataclass |
| 141 | +class TagSymbol: |
| 142 | + tag: Optional[int] = dc.field( |
| 143 | + default=None, metadata={'tlv_type': TypeNumber.PATTERN_TAG}) |
| 144 | + ident: Optional[str] = dc.field( |
| 145 | + default=None, metadata={'tlv_type': TypeNumber.IDENTIFIER}) |
| 146 | + |
| 147 | + |
| 148 | +@dc.dataclass |
| 149 | +class LvsModel: |
| 150 | + version: Optional[int] = dc.field( |
| 151 | + default=None, metadata={'tlv_type': TypeNumber.VERSION}) |
| 152 | + start_id: Optional[int] = dc.field( |
| 153 | + default=None, metadata={'tlv_type': TypeNumber.NODE_ID}) |
| 154 | + named_pattern_cnt: Optional[int] = dc.field( |
| 155 | + default=None, metadata={'tlv_type': TypeNumber.NAMED_PATTERN_NUM}) |
| 156 | + nodes: list[Node] = dc.field( |
| 157 | + default_factory=list, metadata={'tlv_type': TypeNumber.NODE}) |
| 158 | + symbols: list[TagSymbol] = dc.field( |
| 159 | + default_factory=list, metadata={'tlv_type': TypeNumber.TAG_SYMBOL}) |
| 160 | + |
| 161 | + def encode(self) -> bytearray: |
| 162 | + return tlv_encode(self) |
| 163 | + |
| 164 | + @classmethod |
| 165 | + def parse(cls, wire: BinaryStr) -> 'LvsModel': |
| 166 | + return tlv_parse(cls, wire) |
0 commit comments