@@ -47,25 +47,40 @@ def _unescape_help(text):
47
47
return '' .join (result )
48
48
49
49
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'
52
78
labelname = []
53
79
labelvalue = []
54
- value = []
55
- timestamp = []
56
80
labels = {}
57
81
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' :
69
84
if char == '}' :
70
85
state = 'endoflabels'
71
86
else :
@@ -112,9 +127,32 @@ def _parse_sample(text):
112
127
labelvalue .append ('\\ ' + char )
113
128
elif state == 'endoflabels' :
114
129
if char == ' ' :
115
- state = 'value'
130
+ break
116
131
else :
117
132
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 )
118
156
elif state == 'value' :
119
157
if char == ' ' :
120
158
state = 'timestamp'
@@ -134,26 +172,8 @@ def _parse_sample(text):
134
172
if not value :
135
173
raise ValueError ("Invalid line: " + text )
136
174
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<
711C
/span>][:9 ].ljust (9 , "0" )))
154
- except ValueError :
155
- # Float.
156
- ts = float (timestamp )
175
+ val = _parse_value (value )
176
+ ts = _parse_timestamp (timestamp )
157
177
158
178
return core .Sample ('' .join (name ), labels , val , ts )
159
179
0 commit comments