Skip to content

Commit 75dbc5a

Browse files
committed
feat: add nested class
1 parent 1a92c49 commit 75dbc5a

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed

nested_multipart_parser/declare.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
class NestedDeclare:
2+
def __init__(self, _type=None):
3+
self._elements = {}
4+
self.set_type(_type)
5+
6+
def set_type(self, _type):
7+
self._is_dict = _type is dict
8+
self._is_list = _type is list
9+
self._is_none = _type is None
10+
11+
def set_type_from_key(self, key):
12+
self.set_type(list if isinstance(key, int) else dict)
13+
14+
def conv_value(self, key):
15+
value = self._elements[key]
16+
if isinstance(value, type(self)):
17+
value = value.convert()
18+
return value
19+
20+
def __setitem__(self, key, value):
21+
if self._is_none:
22+
self.set_type_from_key(key)
23+
if isinstance(key, int) and not self._is_list:
24+
raise ValueError("int key cant be integer for dict object")
25+
if not isinstance(key, int) and self._is_list:
26+
raise ValueError("need integer key for list elements")
27+
if key in self._elements:
28+
raise ValueError("key is already set")
29+
30+
self._elements[key] = value
31+
32+
def __getitem__(self, key):
33+
if key not in self._elements:
34+
self[key] = type(self)()
35+
return self._elements[key]
36+
37+
def _convert_list(self):
38+
keys = sorted(self._elements.keys())
39+
if keys != list(range(len(keys))):
40+
raise ValueError("invalid format list keys")
41+
42+
return [self.conv_value(key) for key in keys]
43+
44+
def _convert_dict(self):
45+
return {
46+
key: self.conv_value(value)
47+
for key, value in self._elements.items()
48+
}
49+
50+
def convert(self):
51+
if self._is_none:
52+
return None
53+
if self._is_list:
54+
return self._convert_list()
55+
return self._convert_dict()

0 commit comments

Comments
 (0)