@@ -47,25 +47,40 @@ def _unescape_help(text):
4747 return '' .join (result )
4848
4949
50- def _parse_sample (text ):
51- name = []
50+ def _parse_value (value ):
51+ value = '' .join (value )
52+ try :
53+ return int (value )
54+ except ValueError :
55+ return float (value )
56+
57+
58+ def _parse_timestamp (timestamp ):
59+ timestamp = '' .join (timestamp )
60+ if not timestamp :
61+ return None
62+ try :
63+ # Simple int.
64+ return core .Timestamp (int (timestamp ), 0 )
65+ except ValueError :
66+ try :
67+ # aaaa.bbbb. Nanosecond resolution supported.
68+ parts = timestamp .split ('.' , 1 )
69+ return core .Timestamp (int (parts [0 ]), int (parts [1 ][:9 ].ljust (9 , "0" )))
70+ except ValueError :
71+ # Float.
72+ return float (timestamp )
73+
74+
75+ def _parse_labels (it , text ):
76+ # The { has already been parsed.
77+ state = 'startoflabelname'
5278 labelname = []
5379 labelvalue = []
54- value = []
55- timestamp = []
5680 labels = {}
5781
58- state = 'name'
59-
60- for char in text :
61- if state == 'name' :
62- if char == '{' :
63- state = 'startoflabelname'
64- elif char == ' ' :
65- state = 'value'
66- else :
67- name .append (char )
68- elif state == 'startoflabelname' :
82+ for char in it :
83+ if state == 'startoflabelname' :
6984 if char == '}' :
7085 state = 'endoflabels'
7186 else :
@@ -112,9 +127,32 @@ def _parse_sample(text):
112127 labelvalue .append ('\\ ' + char )
113128 elif state == 'endoflabels' :
114129 if char == ' ' :
115- state = 'value'
130+ break
116131 else :
117132 raise ValueError ("Invalid line: " + text )
133+ return labels
134+
135+
136+ def _parse_sample (text ):
137+ name = []
138+ value = []
139+ timestamp = []
140+ labels = {}
141+
142+ state = 'name'
143+
144+ it = iter (text )
145+
146+ for char in it :
147+ if state == 'name' :
148+ if char == '{' :
149+ labels = _parse_labels (it , text )
150+ # Space has already been parsed.
151+ state = 'value'
152+ elif char == ' ' :
153+ state = 'value'
154+ else :
155+ name .append (char )
118156 elif state == 'value' :
119157 if char == ' ' :
120158 state = 'timestamp'
@@ -134,26 +172,8 @@ def _parse_sample(text):
134172 if not value :
135173 raise ValueError ("Invalid line: " + text )
136174 value = '' .join (value )
137- val = None
138- try :
139- val = int (value )
140- except ValueError :
141- val = float (value )
142-
143- ts = None
144- timestamp = '' .join (timestamp )
145- if timestamp :
146- try :
147- # Simple int.
148- ts = core .Timestamp (int (timestamp ), 0 )
149- except ValueError :
150- try :
151- # aaaa.bbbb. Nanosecond resolution supported.
152- parts = timestamp .split ('.' , 1 )
153- ts = core .Timestamp (int (parts [0 ]), int (parts [1 ][:9 ].ljust (9 , "0" )))
154- except ValueError :
155- # Float.
156- ts = float (timestamp )
175+ val = _parse_value (value )
176+ ts = _parse_timestamp (timestamp )
157177
158178 return core .Sample ('' .join (name ), labels , val , ts )
159179
0 commit comments