1use core::str::FromStr;
2
3use chrono_tz::Tz;
4use pest::{iterators::Pair, Parser as _};
5
6use crate::{
7 array, date_time,
8 date_time64::{self, DateTime64Precision},
9 decimal::{self, DecimalPrecision, DecimalScale},
10 fixed_string::{self, FixedStringN},
11 low_cardinality::{self, LowCardinalityDataType},
12 map::{self, MapKey, MapValue},
13 nullable::{self, NullableTypeName},
14 r#enum::{self, Enum16, Enum8},
15 type_name_parser::{Rule, TypeNameParser},
16 ParseError,
17};
18
19#[derive(PartialEq, Eq, Debug, Clone)]
20pub enum TypeName {
21 UInt8,
22 UInt16,
23 UInt32,
24 UInt64,
25 UInt256,
26 Int8,
27 Int16,
28 Int32,
29 Int64,
30 Int128,
31 Int256,
32 Float32,
33 Float64,
34 Decimal(DecimalPrecision, DecimalScale),
35 String,
36 FixedString(FixedStringN),
37 Uuid,
38 Date,
39 DateTime(Option<Tz>),
40 DateTime64(DateTime64Precision, Option<Tz>),
41 Enum8(Enum8),
42 Enum16(Enum16),
43 Ipv4,
44 Ipv6,
45 LowCardinality(LowCardinalityDataType),
49 Nullable(NullableTypeName),
50 Point,
51 Ring,
52 Polygon,
53 MultiPolygon,
54 Array(Box<Self>),
58 Tuple(Vec<Self>),
59 Map(MapKey, MapValue),
60}
61
62impl FromStr for TypeName {
63 type Err = ParseError;
64
65 fn from_str(s: &str) -> Result<Self, Self::Err> {
66 let pair = TypeNameParser::parse(Rule::type_name, s)
67 .map_err(|err| ParseError::FormatMismatch(err.to_string()))?
68 .next()
69 .ok_or(ParseError::Unknown)?
70 .into_inner()
71 .next()
72 .ok_or(ParseError::Unknown)?;
73
74 Self::from_pair(pair)
75 }
76}
77
78impl TypeName {
79 pub(crate) fn from_pair(pair: Pair<'_, Rule>) -> Result<TypeName, ParseError> {
80 match pair.as_rule() {
81 Rule::UInt8 => Ok(Self::UInt8),
82 Rule::UInt16 => Ok(Self::UInt16),
83 Rule::UInt32 => Ok(Self::UInt32),
84 Rule::UInt64 => Ok(Self::UInt64),
85 Rule::UInt256 => Ok(Self::UInt256),
86 Rule::Int8 => Ok(Self::Int8),
87 Rule::Int16 => Ok(Self::Int16),
88 Rule::Int32 => Ok(Self::Int32),
89 Rule::Int64 => Ok(Self::Int64),
90 Rule::Int128 => Ok(Self::Int128),
91 Rule::Int256 => Ok(Self::Int256),
92 Rule::Float32 => Ok(Self::Float32),
93 Rule::Float64 => Ok(Self::Float64),
94 Rule::Decimal => {
95 let (precision, scale) = decimal::get_precision_and_scale(pair.into_inner())?;
96
97 Ok(Self::Decimal(precision, scale))
98 }
99 Rule::String => Ok(Self::String),
100 Rule::FixedString => {
101 let n = fixed_string::get_n(pair.into_inner())?;
102
103 Ok(Self::FixedString(n))
104 }
105 Rule::UUID => Ok(Self::Uuid),
106 Rule::Date => Ok(Self::Date),
107 Rule::DateTime => {
108 let timezone = date_time::get_timezone(pair.into_inner())?;
109
110 Ok(Self::DateTime(timezone))
111 }
112 Rule::DateTime64 => {
113 let (precision, timezone) =
114 date_time64::get_precision_and_timezone(pair.into_inner())?;
115
116 Ok(Self::DateTime64(precision, timezone))
117 }
118 Rule::Enum8 => {
119 let inner = r#enum::get_enum8(pair.into_inner())?;
120
121 Ok(Self::Enum8(inner))
122 }
123 Rule::Enum16 => {
124 let inner = r#enum::get_enum16(pair.into_inner())?;
125
126 Ok(Self::Enum16(inner))
127 }
128 Rule::IPv4 => Ok(Self::Ipv4),
129 Rule::IPv6 => Ok(Self::Ipv6),
130 Rule::LowCardinality => {
134 let data_type = low_cardinality::get_data_type(pair.into_inner())?;
135
136 Ok(Self::LowCardinality(data_type))
137 }
138 Rule::Nullable => {
139 let type_name = nullable::get_type_name(pair.into_inner())?;
140
141 Ok(Self::Nullable(type_name))
142 }
143 Rule::Point => Ok(Self::Point),
144 Rule::Ring => Ok(Self::Ring),
145 Rule::Polygon => Ok(Self::Polygon),
146 Rule::MultiPolygon => Ok(Self::MultiPolygon),
147 Rule::Array => {
151 let data_type = array::get_data_type(pair.into_inner())?;
152
153 Ok(Self::Array(data_type.into()))
154 }
155 Rule::Tuple => {
156 let pairs: Vec<_> = pair.into_inner().collect();
157
158 if pairs.is_empty() {
159 return Err(ParseError::Unknown);
160 }
161
162 let mut type_names = vec![];
163 for pair in pairs {
164 let this =
165 Self::from_pair(pair.into_inner().next().ok_or(ParseError::Unknown)?)?;
166 type_names.push(this);
167 }
168 Ok(Self::Tuple(type_names))
169 }
170 Rule::Map => {
171 let (map_key, map_value) = map::get_map_key_and_map_value(pair.into_inner())?;
172
173 Ok(Self::Map(map_key, map_value))
174 }
175 _ => Err(ParseError::Unknown),
176 }
177 }
178}
179
180#[cfg(test)]
181mod tests {
182 use super::*;
183
184 use crate::map::{MapKey, MapValue};
185
186 #[test]
187 fn test_parse_int_uint() -> Result<(), Box<dyn std::error::Error>> {
188 let content = include_str!("../tests/files/int_uint.txt");
189 let line = content.lines().nth(2).unwrap();
190
191 let mut iter = serde_json::from_str::<Vec<String>>(line)?.into_iter();
192
193 assert_eq!(TypeName::UInt8, iter.next().unwrap().parse()?);
194 assert_eq!(TypeName::UInt16, iter.next().unwrap().parse()?);
195 assert_eq!(TypeName::UInt32, iter.next().unwrap().parse()?);
196 assert_eq!(TypeName::UInt64, iter.next().unwrap().parse()?);
197 assert_eq!(TypeName::UInt256, iter.next().unwrap().parse()?);
198 assert_eq!(TypeName::Int8, iter.next().unwrap().parse()?);
199 assert_eq!(TypeName::Int16, iter.next().unwrap().parse()?);
200 assert_eq!(TypeName::Int32, iter.next().unwrap().parse()?);
201 assert_eq!(TypeName::Int64, iter.next().unwrap().parse()?);
202 assert_eq!(TypeName::Int128, iter.next().unwrap().parse()?);
203 assert_eq!(TypeName::Int256, iter.next().unwrap().parse()?);
204
205 assert_eq!(iter.next(), None);
206
207 Ok(())
208 }
209
210 #[test]
211 fn test_parse_float() -> Result<(), Box<dyn std::error::Error>> {
212 let content = include_str!("../tests/files/float.txt");
213 let line = content.lines().nth(2).unwrap();
214
215 let mut iter = serde_json::from_str::<Vec<String>>(line)?.into_iter();
216
217 assert_eq!(TypeName::Float32, iter.next().unwrap().parse()?);
218 assert_eq!(TypeName::Float64, iter.next().unwrap().parse()?);
219
220 assert_eq!(iter.next(), None);
221
222 Ok(())
223 }
224
225 #[test]
226 fn test_parse_decimal() -> Result<(), Box<dyn std::error::Error>> {
227 let content = include_str!("../tests/files/decimal.txt");
228 let line = content.lines().nth(2).unwrap();
229
230 let mut iter = serde_json::from_str::<Vec<String>>(line)?.into_iter();
231
232 for (precision, scale) in vec![
233 (9, 9),
234 (9, 1),
235 (18, 18),
236 (18, 2),
237 (38, 38),
238 (38, 3),
239 (76, 76),
240 (76, 4),
241 ]
242 .into_iter()
243 {
244 assert_eq!(
245 TypeName::Decimal(DecimalPrecision(precision), DecimalScale(scale)),
246 iter.next().unwrap().parse()?
247 );
248 }
249
250 assert_eq!(iter.next(), None);
251
252 Ok(())
253 }
254
255 #[test]
256 fn test_parse_string() -> Result<(), Box<dyn std::error::Error>> {
257 let content = include_str!("../tests/files/string.txt");
258 let line = content.lines().nth(2).unwrap();
259
260 let mut iter = serde_json::from_str::<Vec<String>>(line)?.into_iter();
261
262 assert_eq!(TypeName::String, iter.next().unwrap().parse()?);
263
264 assert_eq!(iter.next(), None);
265
266 Ok(())
267 }
268
269 #[test]
270 fn test_parse_fixedstring() -> Result<(), Box<dyn std::error::Error>> {
271 let content = include_str!("../tests/files/fixedstring.txt");
272 let line = content.lines().nth(2).unwrap();
273
274 let mut iter = serde_json::from_str::<Vec<String>>(line)?.into_iter();
275
276 assert_eq!(
277 TypeName::FixedString(FixedStringN(8)),
278 iter.next().unwrap().parse()?
279 );
280
281 assert_eq!(iter.next(), None);
282
283 Ok(())
284 }
285
286 #[test]
287 fn test_parse_uuid() -> Result<(), Box<dyn std::error::Error>> {
288 let content = include_str!("../tests/files/uuid.txt");
289 let line = content.lines().nth(2).unwrap();
290
291 let mut iter = serde_json::from_str::<Vec<String>>(line)?.into_iter();
292
293 assert_eq!(TypeName::Uuid, iter.next().unwrap().parse()?);
294
295 assert_eq!(iter.next(), None);
296
297 Ok(())
298 }
299
300 #[test]
301 fn test_parse_date() -> Result<(), Box<dyn std::error::Error>> {
302 let content = include_str!("../tests/files/date.txt");
303 let line = content.lines().nth(2).unwrap();
304
305 let mut iter = serde_json::from_str::<Vec<String>>(line)?.into_iter();
306
307 assert_eq!(TypeName::Date, iter.next().unwrap().parse()?);
308
309 assert_eq!(iter.next(), None);
310
311 Ok(())
312 }
313
314 #[test]
315 fn test_parse_datetime() -> Result<(), Box<dyn std::error::Error>> {
316 let content = include_str!("../tests/files/datetime.txt");
317 let line = content.lines().nth(2).unwrap();
318
319 let mut iter = serde_json::from_str::<Vec<String>>(line)?.into_iter();
320
321 assert_eq!(TypeName::DateTime(None), iter.next().unwrap().parse()?);
322 assert_eq!(
323 TypeName::DateTime(Some(Tz::UTC)),
324 iter.next().unwrap().parse()?
325 );
326 assert_eq!(
327 TypeName::DateTime(Some(Tz::Asia__Shanghai)),
328 iter.next().unwrap().parse()?
329 );
330
331 assert_eq!(iter.next(), None);
332
333 Ok(())
334 }
335
336 #[test]
337 fn test_parse_datetime64() -> Result<(), Box<dyn std::error::Error>> {
338 let content = include_str!("../tests/files/datetime64.txt");
339 let line = content.lines().nth(2).unwrap();
340
341 let mut iter = serde_json::from_str::<Vec<String>>(line)?.into_iter();
342
343 assert_eq!(
344 TypeName::DateTime64(DateTime64Precision(0), None),
345 iter.next().unwrap().parse()?
346 );
347 assert_eq!(
348 TypeName::DateTime64(DateTime64Precision(3), Some(Tz::UTC)),
349 iter.next().unwrap().parse()?
350 );
351 assert_eq!(
352 TypeName::DateTime64(DateTime64Precision(9), Some(Tz::Asia__Shanghai)),
353 iter.next().unwrap().parse()?
354 );
355
356 assert_eq!(iter.next(), None);
357
358 Ok(())
359 }
360
361 #[test]
362 fn test_parse_enum() -> Result<(), Box<dyn std::error::Error>> {
363 let content = include_str!("../tests/files/enum.txt");
364 let line = content.lines().nth(2).unwrap();
365
366 let mut iter = serde_json::from_str::<Vec<String>>(line)?.into_iter();
367
368 assert_eq!(
369 TypeName::Enum8(
370 vec![("a".to_owned(), -128), ("b".to_owned(), 127)]
371 .into_iter()
372 .collect()
373 ),
374 iter.next().unwrap().parse()?
375 );
376 assert_eq!(
377 TypeName::Enum16(
378 vec![("a".to_owned(), -32768), ("b".to_owned(), 32767)]
379 .into_iter()
380 .collect()
381 ),
382 iter.next().unwrap().parse()?
383 );
384 assert_eq!(
385 TypeName::Enum8(
386 vec![("0".to_owned(), 0), ("1".to_owned(), 1)]
387 .into_iter()
388 .collect()
389 ),
390 iter.next().unwrap().parse()?
391 );
392
393 assert_eq!(iter.next(), None);
394
395 Ok(())
396 }
397
398 #[test]
399 fn test_parse_lowcardinality() -> Result<(), Box<dyn std::error::Error>> {
400 let content = include_str!("../tests/files/lowcardinality.txt");
401 let line = content.lines().nth(2).unwrap();
402
403 let mut iter = serde_json::from_str::<Vec<String>>(line)?.into_iter();
404
405 assert_eq!(
406 TypeName::LowCardinality(LowCardinalityDataType::String),
407 iter.next().unwrap().parse()?
408 );
409 assert_eq!(
410 TypeName::LowCardinality(LowCardinalityDataType::FixedString(FixedStringN(1))),
411 iter.next().unwrap().parse()?
412 );
413 assert_eq!(
414 TypeName::LowCardinality(LowCardinalityDataType::Date),
415 iter.next().unwrap().parse()?
416 );
417 assert_eq!(
418 TypeName::LowCardinality(LowCardinalityDataType::DateTime(None)),
419 iter.next().unwrap().parse()?
420 );
421 assert_eq!(
422 TypeName::LowCardinality(LowCardinalityDataType::UInt8),
423 iter.next().unwrap().parse()?
424 );
425 assert_eq!(
426 TypeName::LowCardinality(LowCardinalityDataType::UInt16),
427 iter.next().unwrap().parse()?
428 );
429 assert_eq!(
430 TypeName::LowCardinality(LowCardinalityDataType::UInt32),
431 iter.next().unwrap().parse()?
432 );
433 assert_eq!(
434 TypeName::LowCardinality(LowCardinalityDataType::UInt64),
435 iter.next().unwrap().parse()?
436 );
437 assert_eq!(
438 TypeName::LowCardinality(LowCardinalityDataType::Int8),
439 iter.next().unwrap().parse()?
440 );
441 assert_eq!(
442 TypeName::LowCardinality(LowCardinalityDataType::Int16),
443 iter.next().unwrap().parse()?
444 );
445 assert_eq!(
446 TypeName::LowCardinality(LowCardinalityDataType::Int32),
447 iter.next().unwrap().parse()?
448 );
449 assert_eq!(
450 TypeName::LowCardinality(LowCardinalityDataType::Int64),
451 iter.next().unwrap().parse()?
452 );
453 assert_eq!(
454 TypeName::LowCardinality(LowCardinalityDataType::Float32),
455 iter.next().unwrap().parse()?
456 );
457 assert_eq!(
458 TypeName::LowCardinality(LowCardinalityDataType::Float64),
459 iter.next().unwrap().parse()?
460 );
461 assert_eq!(
462 TypeName::LowCardinality(LowCardinalityDataType::Nullable(NullableTypeName::String)),
463 iter.next().unwrap().parse()?
464 );
465 assert_eq!(
466 TypeName::LowCardinality(LowCardinalityDataType::Nullable(NullableTypeName::String)),
467 iter.next().unwrap().parse()?
468 );
469 assert_eq!(
470 TypeName::LowCardinality(LowCardinalityDataType::Ipv4),
471 iter.next().unwrap().parse()?
472 );
473 assert_eq!(
474 TypeName::LowCardinality(LowCardinalityDataType::Ipv6),
475 iter.next().unwrap().parse()?
476 );
477
478 assert_eq!(iter.next(), None);
479
480 Ok(())
481 }
482
483 #[test]
484 fn test_parse_nullable() -> Result<(), Box<dyn std::error::Error>> {
485 let content = include_str!("../tests/files/nullable.txt");
486 let line = content.lines().nth(2).unwrap();
487
488 let mut iter = serde_json::from_str::<Vec<String>>(line)?.into_iter();
489
490 assert_eq!(
491 TypeName::Nullable(NullableTypeName::UInt8),
492 iter.next().unwrap().parse()?
493 );
494 assert_eq!(
495 TypeName::Nullable(NullableTypeName::UInt256),
496 iter.next().unwrap().parse()?
497 );
498 assert_eq!(
499 TypeName::Nullable(NullableTypeName::Int8),
500 iter.next().unwrap().parse()?
501 );
502 assert_eq!(
503 TypeName::Nullable(NullableTypeName::Int256),
504 iter.next().unwrap().parse()?
505 );
506 assert_eq!(
507 TypeName::Nullable(NullableTypeName::Float64),
508 iter.next().unwrap().parse()?
509 );
510 assert_eq!(
511 TypeName::Nullable(NullableTypeName::Decimal(
512 DecimalPrecision(76),
513 DecimalScale(4)
514 )),
515 iter.next().unwrap().parse()?
516 );
517 assert_eq!(
518 TypeName::Nullable(NullableTypeName::String),
519 iter.next().unwrap().parse()?
520 );
521 assert_eq!(
522 TypeName::Nullable(NullableTypeName::FixedString(FixedStringN(1))),
523 iter.next().unwrap().parse()?
524 );
525 assert_eq!(
526 TypeName::Nullable(NullableTypeName::Uuid),
527 iter.next().unwrap().parse()?
528 );
529 assert_eq!(
530 TypeName::Nullable(NullableTypeName::Date),
531 iter.next().unwrap().parse()?
532 );
533 assert_eq!(
534 TypeName::Nullable(NullableTypeName::DateTime(None)),
535 iter.next().unwrap().parse()?
536 );
537 assert_eq!(
538 TypeName::Nullable(NullableTypeName::DateTime64(DateTime64Precision(0), None)),
539 iter.next().unwrap().parse()?
540 );
541 assert_eq!(
542 TypeName::Nullable(NullableTypeName::Enum8(
543 vec![("a".to_owned(), -128), ("b".to_owned(), 127)]
544 .into_iter()
545 .collect()
546 )),
547 iter.next().unwrap().parse()?
548 );
549 assert_eq!(
550 TypeName::Nullable(NullableTypeName::Nothing),
551 iter.next().unwrap().parse()?
552 );
553 assert_eq!(
554 TypeName::Nullable(NullableTypeName::Ipv4),
555 iter.next().unwrap().parse()?
556 );
557 assert_eq!(
558 TypeName::Nullable(NullableTypeName::Ipv6),
559 iter.next().unwrap().parse()?
560 );
561
562 assert_eq!(iter.next(), None);
563
564 Ok(())
565 }
566
567 #[test]
568 fn test_parse_array() -> Result<(), Box<dyn std::error::Error>> {
569 let content = include_str!("../tests/files/array.txt");
570 let line = content.lines().nth(2).unwrap();
571
572 let mut iter = serde_json::from_str::<Vec<String>>(line)?.into_iter();
573
574 assert_eq!(
575 TypeName::Array(TypeName::UInt8.into()),
576 iter.next().unwrap().parse()?
577 );
578 assert_eq!(
579 TypeName::Array(TypeName::UInt8.into()),
580 iter.next().unwrap().parse()?
581 );
582 assert_eq!(
583 TypeName::Array(TypeName::Nullable(NullableTypeName::UInt8).into()),
584 iter.next().unwrap().parse()?
585 );
586 assert_eq!(
587 TypeName::Array(TypeName::Array(TypeName::UInt8.into()).into()),
588 iter.next().unwrap().parse()?
589 );
590 assert_eq!(
591 TypeName::Array(
592 TypeName::Tuple(vec![
593 TypeName::UInt8,
594 TypeName::Nullable(NullableTypeName::Nothing)
595 ])
596 .into()
597 ),
598 iter.next().unwrap().parse()?
599 );
600
601 assert_eq!(iter.next(), None);
602
603 Ok(())
604 }
605
606 #[test]
607 fn test_parse_tuple() -> Result<(), Box<dyn std::error::Error>> {
608 let content = include_str!("../tests/files/tuple.txt");
609 let line = content.lines().nth(2).unwrap();
610
611 let mut iter = serde_json::from_str::<Vec<String>>(line)?.into_iter();
612
613 assert_eq!(
614 TypeName::Tuple(vec![TypeName::String, TypeName::UInt8]),
615 iter.next().unwrap().parse()?
616 );
617 assert_eq!(
618 TypeName::Tuple(vec![TypeName::String, TypeName::UInt8]),
619 iter.next().unwrap().parse()?
620 );
621 assert_eq!(
622 TypeName::Tuple(vec![
623 TypeName::String,
624 TypeName::Nullable(NullableTypeName::UInt8)
625 ]),
626 iter.next().unwrap().parse()?
627 );
628 assert_eq!(
629 TypeName::Tuple(vec![
630 TypeName::String,
631 TypeName::Array(TypeName::UInt8.into()),
632 ]),
633 iter.next().unwrap().parse()?
634 );
635 assert_eq!(
636 TypeName::Tuple(vec![
637 TypeName::String,
638 TypeName::Tuple(vec![
639 TypeName::UInt8,
640 TypeName::Nullable(NullableTypeName::Nothing)
641 ]),
642 ]),
643 iter.next().unwrap().parse()?
644 );
645
646 assert_eq!(iter.next(), None);
647
648 Ok(())
649 }
650
651 #[test]
652 fn test_parse_ipv4() -> Result<(), Box<dyn std::error::Error>> {
653 let content = include_str!("../tests/files/ipv4.txt");
654 let line = content.lines().nth(2).unwrap();
655
656 let mut iter = serde_json::from_str::<Vec<String>>(line)?.into_iter();
657
658 assert_eq!(TypeName::Ipv4, iter.next().unwrap().parse()?);
659
660 assert_eq!(iter.next(), None);
661
662 Ok(())
663 }
664
665 #[test]
666 fn test_parse_ipv6() -> Result<(), Box<dyn std::error::Error>> {
667 let content = include_str!("../tests/files/ipv6.txt");
668 let line = content.lines().nth(2).unwrap();
669
670 let mut iter = serde_json::from_str::<Vec<String>>(line)?.into_iter();
671
672 assert_eq!(TypeName::Ipv6, iter.next().unwrap().parse()?);
673
674 assert_eq!(iter.next(), None);
675
676 Ok(())
677 }
678
679 #[test]
680 fn test_parse_geo() -> Result<(), Box<dyn std::error::Error>> {
681 assert_eq!(TypeName::Point, "Point".parse()?);
682 assert_eq!(TypeName::Ring, "Ring".parse()?);
683 assert_eq!(TypeName::Polygon, "Polygon".parse()?);
684 assert_eq!(TypeName::MultiPolygon, "MultiPolygon".parse()?);
685
686 Ok(())
687 }
688
689 #[test]
690 fn test_parse_map() -> Result<(), Box<dyn std::error::Error>> {
691 let content = include_str!("../tests/files/map.txt");
692 let line = content.lines().nth(2).unwrap();
693
694 let mut iter = serde_json::from_str::<Vec<String>>(line)?.into_iter();
695
696 assert_eq!(
697 TypeName::Map(MapKey::String, MapValue::String),
698 iter.next().unwrap().parse()?
699 );
700 assert_eq!(
701 TypeName::Map(MapKey::FixedString(FixedStringN(2)), MapValue::String),
702 iter.next().unwrap().parse()?
703 );
704 assert_eq!(
705 TypeName::Map(MapKey::UInt256, MapValue::String),
706 iter.next().unwrap().parse()?
707 );
708 assert_eq!(
709 TypeName::Map(MapKey::Int256, MapValue::String),
710 iter.next().unwrap().parse()?
711 );
712 assert_eq!(
713 TypeName::Map(MapKey::Float64, MapValue::String),
714 iter.next().unwrap().parse()?
715 );
716 assert_eq!(
717 TypeName::Map(
718 MapKey::Decimal(DecimalPrecision(9), DecimalScale(9)),
719 MapValue::String
720 ),
721 iter.next().unwrap().parse()?
722 );
723 assert_eq!(
724 TypeName::Map(MapKey::String, MapValue::Array(TypeName::String.into())),
725 iter.next().unwrap().parse()?
726 );
727
728 assert_eq!(iter.next(), None);
729
730 Ok(())
731 }
732}