@@ -116,60 +116,70 @@ def parse_segment(self, segment):
116
116
seg = clazz ()
117
117
118
118
data = iter (segment )
119
- for name , field in seg ._fields .items ():
120
- try :
121
- val = next (data )
122
- except StopIteration :
123
- if field .required :
124
- raise ValueError ("Required field {}.{} was not present" .format (clazz .__name__ , name ))
119
+ for number , (name , field ) in enumerate (seg ._fields .items ()):
120
+ vals = self .parse_repeat (field , data , number == len (seg ._fields )- 1 )
121
+ if field .count == 1 :
122
+ if len (vals ):
123
+ setattr (seg , name , vals [0 ])
124
+ else :
125
+ if field .required :
126
+ raise ValueError ("Required field {}.{} was not present" .format (seg .__class__ .__name__ , name ))
125
127
else :
126
- deg = self . parse_n_deg ( field , val )
127
- setattr ( seg , name , deg )
128
+ setattr ( seg , name , vals )
129
+
128
130
seg ._additional_data = list (data )
129
131
130
132
return seg
131
133
132
- def parse_n_deg (self , field , data ):
133
- if not isinstance (data , Iterable ) or isinstance (data , (str , bytes )):
134
- data = [data ]
135
-
136
- data_i = iter (data )
137
- field_index = 0
138
- field_length = field .flat_length
139
-
134
+ def parse_repeat (self , field , data_i , is_last ):
140
135
retval = []
141
- eod = False
142
136
143
- while not eod :
144
- vals = []
137
+ if field .count == 1 :
145
138
try :
146
- for x in range (field_length ):
147
- vals .append (next (data_i ))
139
+ val = next (data_i )
148
140
except StopIteration :
149
- eod = True
150
-
151
- if field . count == 1 :
152
- if isinstance ( field , DataElementField ) :
153
- if not len ( vals ):
154
- return
155
- return vals [ 0 ]
156
- elif isinstance ( field , DataElementGroupField ) :
157
- return self . parse_deg ( field . type , vals )
141
+ pass
142
+ else :
143
+ retval . append ( self . parse_n_deg ( field , val ) )
144
+ else :
145
+ for i in range ( field . count if field . count is not None else field . max_count ):
146
+ try :
147
+ val = next ( data_i )
148
+ except StopIteration :
149
+ break
158
150
else :
159
- raise Error ("Internal error" )
160
- break
151
+ retval .append (self .parse_n_deg (field , val , is_last ))
161
152
162
- if field_index >= (field .count if field .count is not None else len (data ) // field_length ):
163
- break
153
+ return retval
164
154
165
- if isinstance (field , DataElementField ):
166
- retval .append (vals [0 ] if len (vals ) else None )
167
- elif isinstance (field , DataElementGroupField ):
168
- retval .append (self .parse_deg (field .type , vals ))
169
- else :
170
- raise Error ("Internal error" )
171
155
172
- return retval
156
+ def parse_n_deg (self , field , data , is_last = False ):
157
+ if not isinstance (data , Iterable ) or isinstance (data , (str , bytes )):
158
+ data = [data ]
159
+
160
+ data_i = iter (data )
161
+ if is_last :
162
+ field_length = field .flat_length_max
163
+ else :
164
+ field_length = field .flat_length
165
+
166
+ eod = False
167
+
168
+ vals = []
169
+ try :
170
+ for x in range (field_length ):
171
+ vals .append (next (data_i ))
172
+ except StopIteration :
173
+ pass
174
+
175
+ if isinstance (field , DataElementField ):
176
+ if not len (vals ):
177
+ return
178
+ return vals [0 ]
179
+ elif isinstance (field , DataElementGroupField ):
180
+ return self .parse_deg (field .type , vals )
181
+ else :
182
+ raise Error ("Internal error" )
173
183
174
184
def parse_deg (self , clazz , vals ):
175
185
retval = clazz ()
0 commit comments