1use core::{fmt, result};
8
9use blake2::digest::MacError;
10
11#[derive(Clone, Copy, Debug, Eq, PartialEq)]
13pub enum Error {
14 InvalidLength,
16
17 InvalidMagicNumber,
19
20 UnsupportedVersion(u8),
22
23 UnknownVersion(u8),
25
26 InvalidArgon2Type(u32),
28
29 InvalidArgon2Version(u32),
31
32 InvalidArgon2Params(argon2::Error),
34
35 InvalidArgon2Context(argon2::Error),
37
38 InvalidHeaderMac(MacError),
40
41 InvalidMac(chacha20poly1305::Error),
43}
44
45impl fmt::Display for Error {
46 #[inline]
47 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
48 match self {
49 Self::InvalidLength => write!(f, "encrypted data is shorter than 164 bytes"),
50 Self::InvalidMagicNumber => write!(f, "invalid magic number"),
51 Self::UnsupportedVersion(version) => {
52 write!(f, "unsupported version number `{version}`")
53 }
54 Self::UnknownVersion(version) => write!(f, "unknown version number `{version}`"),
55 Self::InvalidArgon2Type(_) => write!(f, "invalid Argon2 type"),
56 Self::InvalidArgon2Version(version) => {
57 write!(f, "invalid Argon2 version `{version:#x}`")
58 }
59 Self::InvalidArgon2Params(_) => write!(f, "invalid Argon2 parameters"),
60 Self::InvalidArgon2Context(_) => write!(f, "invalid Argon2 context"),
61 Self::InvalidHeaderMac(_) => write!(f, "invalid header MAC"),
62 Self::InvalidMac(_) => write!(f, "invalid ciphertext MAC"),
63 }
64 }
65}
66
67#[cfg(feature = "std")]
68impl std::error::Error for Error {
69 #[inline]
70 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
71 match self {
72 Self::InvalidArgon2Params(err) | Self::InvalidArgon2Context(err) => Some(err),
73 Self::InvalidHeaderMac(err) => Some(err),
74 Self::InvalidMac(err) => Some(err),
75 _ => None,
76 }
77 }
78}
79
80impl From<MacError> for Error {
81 #[inline]
82 fn from(err: MacError) -> Self {
83 Self::InvalidHeaderMac(err)
84 }
85}
86
87impl From<chacha20poly1305::Error> for Error {
88 #[inline]
89 fn from(err: chacha20poly1305::Error) -> Self {
90 Self::InvalidMac(err)
91 }
92}
93
94pub type Result<T> = result::Result<T, Error>;
123
124#[cfg(test)]
125mod tests {
126 use core::any;
127
128 use super::*;
129
130 #[test]
131 fn clone() {
132 assert_eq!(Error::InvalidLength.clone(), Error::InvalidLength);
133 assert_eq!(Error::InvalidMagicNumber.clone(), Error::InvalidMagicNumber);
134 assert_eq!(
135 Error::UnsupportedVersion(u8::MIN).clone(),
136 Error::UnsupportedVersion(u8::MIN)
137 );
138 assert_eq!(
139 Error::UnknownVersion(u8::MAX).clone(),
140 Error::UnknownVersion(u8::MAX)
141 );
142 assert_eq!(
143 Error::InvalidArgon2Type(u32::MAX).clone(),
144 Error::InvalidArgon2Type(u32::MAX)
145 );
146 assert_eq!(
147 Error::InvalidArgon2Version(u32::MAX).clone(),
148 Error::InvalidArgon2Version(u32::MAX)
149 );
150 assert_eq!(
151 Error::InvalidArgon2Params(argon2::Error::AdTooLong).clone(),
152 Error::InvalidArgon2Params(argon2::Error::AdTooLong)
153 );
154 assert_eq!(
155 Error::InvalidArgon2Context(argon2::Error::AdTooLong).clone(),
156 Error::InvalidArgon2Context(argon2::Error::AdTooLong)
157 );
158 assert_eq!(
159 Error::InvalidHeaderMac(MacError).clone(),
160 Error::InvalidHeaderMac(MacError)
161 );
162 assert_eq!(
163 Error::InvalidMac(chacha20poly1305::Error).clone(),
164 Error::InvalidMac(chacha20poly1305::Error)
165 );
166 }
167
168 #[test]
169 fn copy() {
170 {
171 let a = Error::InvalidLength;
172 let b = a;
173 assert_eq!(a, b);
174 }
175
176 {
177 let a = Error::InvalidMagicNumber;
178 let b = a;
179 assert_eq!(a, b);
180 }
181
182 {
183 let a = Error::UnsupportedVersion(u8::MIN);
184 let b = a;
185 assert_eq!(a, b);
186 }
187
188 {
189 let a = Error::UnknownVersion(u8::MAX);
190 let b = a;
191 assert_eq!(a, b);
192 }
193
194 {
195 let a = Error::InvalidArgon2Type(u32::MAX);
196 let b = a;
197 assert_eq!(a, b);
198 }
199
200 {
201 let a = Error::InvalidArgon2Version(u32::MAX);
202 let b = a;
203 assert_eq!(a, b);
204 }
205
206 {
207 let a = Error::InvalidArgon2Params(argon2::Error::AdTooLong);
208 let b = a;
209 assert_eq!(a, b);
210 }
211
212 {
213 let a = Error::InvalidArgon2Context(argon2::Error::AdTooLong);
214 let b = a;
215 assert_eq!(a, b);
216 }
217
218 {
219 let a = Error::InvalidHeaderMac(MacError);
220 let b = a;
221 assert_eq!(a, b);
222 }
223
224 {
225 let a = Error::InvalidMac(chacha20poly1305::Error);
226 let b = a;
227 assert_eq!(a, b);
228 }
229 }
230
231 #[cfg(feature = "alloc")]
232 #[test]
233 fn debug() {
234 assert_eq!(format!("{:?}", Error::InvalidLength), "InvalidLength");
235 assert_eq!(
236 format!("{:?}", Error::InvalidMagicNumber),
237 "InvalidMagicNumber"
238 );
239 assert_eq!(
240 format!("{:?}", Error::UnsupportedVersion(u8::MIN)),
241 "UnsupportedVersion(0)"
242 );
243 assert_eq!(
244 format!("{:?}", Error::UnknownVersion(u8::MAX)),
245 "UnknownVersion(255)"
246 );
247 assert_eq!(
248 format!("{:?}", Error::InvalidArgon2Type(u32::MAX)),
249 "InvalidArgon2Type(4294967295)"
250 );
251 assert_eq!(
252 format!("{:?}", Error::InvalidArgon2Version(u32::MAX)),
253 "InvalidArgon2Version(4294967295)"
254 );
255 assert_eq!(
256 format!("{:?}", Error::InvalidArgon2Params(argon2::Error::AdTooLong)),
257 "InvalidArgon2Params(AdTooLong)"
258 );
259 assert_eq!(
260 format!(
261 "{:?}",
262 Error::InvalidArgon2Context(argon2::Error::AdTooLong)
263 ),
264 "InvalidArgon2Context(AdTooLong)"
265 );
266 assert_eq!(
267 format!("{:?}", Error::InvalidHeaderMac(MacError)),
268 "InvalidHeaderMac(MacError)"
269 );
270 assert_eq!(
271 format!("{:?}", Error::InvalidMac(chacha20poly1305::Error)),
272 "InvalidMac(Error)"
273 );
274 }
275
276 #[test]
277 fn equality() {
278 assert_eq!(Error::InvalidLength, Error::InvalidLength);
279 assert_ne!(Error::InvalidLength, Error::InvalidMagicNumber);
280 assert_ne!(Error::InvalidLength, Error::UnsupportedVersion(u8::MIN));
281 assert_ne!(Error::InvalidLength, Error::UnknownVersion(u8::MAX));
282 assert_ne!(Error::InvalidLength, Error::InvalidArgon2Type(u32::MAX));
283 assert_ne!(Error::InvalidLength, Error::InvalidArgon2Version(u32::MAX));
284 assert_ne!(
285 Error::InvalidLength,
286 Error::InvalidArgon2Params(argon2::Error::AdTooLong)
287 );
288 assert_ne!(
289 Error::InvalidLength,
290 Error::InvalidArgon2Context(argon2::Error::AdTooLong)
291 );
292 assert_ne!(Error::InvalidLength, Error::InvalidHeaderMac(MacError));
293 assert_ne!(
294 Error::InvalidLength,
295 Error::InvalidMac(chacha20poly1305::Error)
296 );
297 assert_ne!(Error::InvalidMagicNumber, Error::InvalidLength);
298 assert_eq!(Error::InvalidMagicNumber, Error::InvalidMagicNumber);
299 assert_ne!(
300 Error::InvalidMagicNumber,
301 Error::UnsupportedVersion(u8::MIN)
302 );
303 assert_ne!(Error::InvalidMagicNumber, Error::UnknownVersion(u8::MAX));
304 assert_ne!(
305 Error::InvalidMagicNumber,
306 Error::InvalidArgon2Type(u32::MAX)
307 );
308 assert_ne!(
309 Error::InvalidMagicNumber,
310 Error::InvalidArgon2Version(u32::MAX)
311 );
312 assert_ne!(
313 Error::InvalidMagicNumber,
314 Error::InvalidArgon2Params(argon2::Error::AdTooLong)
315 );
316 assert_ne!(
317 Error::InvalidMagicNumber,
318 Error::InvalidArgon2Context(argon2::Error::AdTooLong)
319 );
320 assert_ne!(Error::InvalidMagicNumber, Error::InvalidHeaderMac(MacError));
321 assert_ne!(
322 Error::InvalidMagicNumber,
323 Error::InvalidMac(chacha20poly1305::Error)
324 );
325 assert_ne!(Error::UnsupportedVersion(u8::MIN), Error::InvalidLength);
326 assert_ne!(
327 Error::UnsupportedVersion(u8::MIN),
328 Error::InvalidMagicNumber
329 );
330 assert_eq!(
331 Error::UnsupportedVersion(u8::MIN),
332 Error::UnsupportedVersion(u8::MIN)
333 );
334 assert_ne!(
335 Error::UnsupportedVersion(u8::MIN),
336 Error::UnknownVersion(u8::MAX)
337 );
338 assert_ne!(
339 Error::UnsupportedVersion(u8::MIN),
340 Error::InvalidArgon2Type(u32::MAX)
341 );
342 assert_ne!(
343 Error::UnsupportedVersion(u8::MIN),
344 Error::InvalidArgon2Version(u32::MAX)
345 );
346 assert_ne!(
347 Error::UnsupportedVersion(u8::MIN),
348 Error::InvalidArgon2Params(argon2::Error::AdTooLong)
349 );
350 assert_ne!(
351 Error::UnsupportedVersion(u8::MIN),
352 Error::InvalidArgon2Context(argon2::Error::AdTooLong)
353 );
354 assert_ne!(
355 Error::UnsupportedVersion(u8::MIN),
356 Error::InvalidHeaderMac(MacError)
357 );
358 assert_ne!(
359 Error::UnsupportedVersion(u8::MIN),
360 Error::InvalidMac(chacha20poly1305::Error)
361 );
362 assert_ne!(Error::UnknownVersion(u8::MAX), Error::InvalidLength);
363 assert_ne!(Error::UnknownVersion(u8::MAX), Error::InvalidMagicNumber);
364 assert_ne!(
365 Error::UnknownVersion(u8::MAX),
366 Error::UnsupportedVersion(u8::MIN)
367 );
368 assert_eq!(
369 Error::UnknownVersion(u8::MAX),
370 Error::UnknownVersion(u8::MAX)
371 );
372 assert_ne!(
373 Error::UnknownVersion(u8::MAX),
374 Error::InvalidArgon2Type(u32::MAX)
375 );
376 assert_ne!(
377 Error::UnknownVersion(u8::MAX),
378 Error::InvalidArgon2Version(u32::MAX)
379 );
380 assert_ne!(
381 Error::UnknownVersion(u8::MAX),
382 Error::InvalidArgon2Params(argon2::Error::AdTooLong)
383 );
384 assert_ne!(
385 Error::UnknownVersion(u8::MAX),
386 Error::InvalidArgon2Context(argon2::Error::AdTooLong)
387 );
388 assert_ne!(
389 Error::UnknownVersion(u8::MAX),
390 Error::InvalidHeaderMac(MacError)
391 );
392 assert_ne!(
393 Error::UnknownVersion(u8::MAX),
394 Error::InvalidMac(chacha20poly1305::Error)
395 );
396 assert_ne!(Error::InvalidArgon2Type(u32::MAX), Error::InvalidLength);
397 assert_ne!(
398 Error::InvalidArgon2Type(u32::MAX),
399 Error::InvalidMagicNumber
400 );
401 assert_ne!(
402 Error::InvalidArgon2Type(u32::MAX),
403 Error::UnsupportedVersion(u8::MIN)
404 );
405 assert_ne!(
406 Error::InvalidArgon2Type(u32::MAX),
407 Error::UnknownVersion(u8::MAX)
408 );
409 assert_eq!(
410 Error::InvalidArgon2Type(u32::MAX),
411 Error::InvalidArgon2Type(u32::MAX)
412 );
413 assert_ne!(
414 Error::InvalidArgon2Type(u32::MAX),
415 Error::InvalidArgon2Version(u32::MAX)
416 );
417 assert_ne!(
418 Error::InvalidArgon2Type(u32::MAX),
419 Error::InvalidArgon2Params(argon2::Error::AdTooLong)
420 );
421 assert_ne!(
422 Error::InvalidArgon2Type(u32::MAX),
423 Error::InvalidArgon2Context(argon2::Error::AdTooLong)
424 );
425 assert_ne!(
426 Error::InvalidArgon2Type(u32::MAX),
427 Error::InvalidHeaderMac(MacError)
428 );
429 assert_ne!(
430 Error::InvalidArgon2Type(u32::MAX),
431 Error::InvalidMac(chacha20poly1305::Error)
432 );
433 assert_ne!(Error::InvalidArgon2Version(u32::MAX), Error::InvalidLength);
434 assert_ne!(
435 Error::InvalidArgon2Version(u32::MAX),
436 Error::InvalidMagicNumber
437 );
438 assert_ne!(
439 Error::InvalidArgon2Version(u32::MAX),
440 Error::UnsupportedVersion(u8::MIN)
441 );
442 assert_ne!(
443 Error::InvalidArgon2Version(u32::MAX),
444 Error::UnknownVersion(u8::MAX)
445 );
446 assert_ne!(
447 Error::InvalidArgon2Version(u32::MAX),
448 Error::InvalidArgon2Type(u32::MAX)
449 );
450 assert_eq!(
451 Error::InvalidArgon2Version(u32::MAX),
452 Error::InvalidArgon2Version(u32::MAX)
453 );
454 assert_ne!(
455 Error::InvalidArgon2Version(u32::MAX),
456 Error::InvalidArgon2Params(argon2::Error::AdTooLong)
457 );
458 assert_ne!(
459 Error::InvalidArgon2Version(u32::MAX),
460 Error::InvalidArgon2Context(argon2::Error::AdTooLong)
461 );
462 assert_ne!(
463 Error::InvalidArgon2Version(u32::MAX),
464 Error::InvalidHeaderMac(MacError)
465 );
466 assert_ne!(
467 Error::InvalidArgon2Version(u32::MAX),
468 Error::InvalidMac(chacha20poly1305::Error)
469 );
470 assert_ne!(
471 Error::InvalidArgon2Params(argon2::Error::AdTooLong),
472 Error::InvalidLength
473 );
474 assert_ne!(
475 Error::InvalidArgon2Params(argon2::Error::AdTooLong),
476 Error::InvalidMagicNumber
477 );
478 assert_ne!(
479 Error::InvalidArgon2Params(argon2::Error::AdTooLong),
480 Error::UnsupportedVersion(u8::MIN)
481 );
482 assert_ne!(
483 Error::InvalidArgon2Params(argon2::Error::AdTooLong),
484 Error::UnknownVersion(u8::MAX)
485 );
486 assert_ne!(
487 Error::InvalidArgon2Params(argon2::Error::AdTooLong),
488 Error::InvalidArgon2Type(u32::MAX)
489 );
490 assert_ne!(
491 Error::InvalidArgon2Params(argon2::Error::AdTooLong),
492 Error::InvalidArgon2Version(u32::MAX)
493 );
494 assert_eq!(
495 Error::InvalidArgon2Params(argon2::Error::AdTooLong),
496 Error::InvalidArgon2Params(argon2::Error::AdTooLong)
497 );
498 assert_ne!(
499 Error::InvalidArgon2Params(argon2::Error::AdTooLong),
500 Error::InvalidArgon2Context(argon2::Error::AdTooLong)
501 );
502 assert_ne!(
503 Error::InvalidArgon2Params(argon2::Error::AdTooLong),
504 Error::InvalidHeaderMac(MacError)
505 );
506 assert_ne!(
507 Error::InvalidArgon2Params(argon2::Error::AdTooLong),
508 Error::InvalidMac(chacha20poly1305::Error)
509 );
510 assert_ne!(
511 Error::InvalidArgon2Context(argon2::Error::AdTooLong),
512 Error::InvalidLength
513 );
514 assert_ne!(
515 Error::InvalidArgon2Context(argon2::Error::AdTooLong),
516 Error::InvalidMagicNumber
517 );
518 assert_ne!(
519 Error::InvalidArgon2Context(argon2::Error::AdTooLong),
520 Error::UnsupportedVersion(u8::MIN)
521 );
522 assert_ne!(
523 Error::InvalidArgon2Context(argon2::Error::AdTooLong),
524 Error::UnknownVersion(u8::MAX)
525 );
526 assert_ne!(
527 Error::InvalidArgon2Context(argon2::Error::AdTooLong),
528 Error::InvalidArgon2Type(u32::MAX)
529 );
530 assert_ne!(
531 Error::InvalidArgon2Context(argon2::Error::AdTooLong),
532 Error::InvalidArgon2Version(u32::MAX)
533 );
534 assert_ne!(
535 Error::InvalidArgon2Context(argon2::Error::AdTooLong),
536 Error::InvalidArgon2Params(argon2::Error::AdTooLong)
537 );
538 assert_eq!(
539 Error::InvalidArgon2Context(argon2::Error::AdTooLong),
540 Error::InvalidArgon2Context(argon2::Error::AdTooLong)
541 );
542 assert_ne!(
543 Error::InvalidArgon2Context(argon2::Error::AdTooLong),
544 Error::InvalidHeaderMac(MacError)
545 );
546 assert_ne!(
547 Error::InvalidArgon2Context(argon2::Error::AdTooLong),
548 Error::InvalidMac(chacha20poly1305::Error)
549 );
550 assert_ne!(Error::InvalidHeaderMac(MacError), Error::InvalidLength);
551 assert_ne!(Error::InvalidHeaderMac(MacError), Error::InvalidMagicNumber);
552 assert_ne!(
553 Error::InvalidHeaderMac(MacError),
554 Error::UnsupportedVersion(u8::MIN)
555 );
556 assert_ne!(
557 Error::InvalidHeaderMac(MacError),
558 Error::UnknownVersion(u8::MAX)
559 );
560 assert_ne!(
561 Error::InvalidHeaderMac(MacError),
562 Error::InvalidArgon2Type(u32::MAX)
563 );
564 assert_ne!(
565 Error::InvalidHeaderMac(MacError),
566 Error::InvalidArgon2Version(u32::MAX)
567 );
568 assert_ne!(
569 Error::InvalidHeaderMac(MacError),
570 Error::InvalidArgon2Params(argon2::Error::AdTooLong)
571 );
572 assert_ne!(
573 Error::InvalidHeaderMac(MacError),
574 Error::InvalidArgon2Context(argon2::Error::AdTooLong)
575 );
576 assert_eq!(
577 Error::InvalidHeaderMac(MacError),
578 Error::InvalidHeaderMac(MacError)
579 );
580 assert_ne!(
581 Error::InvalidHeaderMac(MacError),
582 Error::InvalidMac(chacha20poly1305::Error)
583 );
584 assert_ne!(
585 Error::InvalidMac(chacha20poly1305::Error),
586 Error::InvalidLength
587 );
588 assert_ne!(
589 Error::InvalidMac(chacha20poly1305::Error),
590 Error::InvalidMagicNumber
591 );
592 assert_ne!(
593 Error::InvalidMac(chacha20poly1305::Error),
594 Error::UnsupportedVersion(u8::MIN)
595 );
596 assert_ne!(
597 Error::InvalidMac(chacha20poly1305::Error),
598 Error::UnknownVersion(u8::MAX)
599 );
600 assert_ne!(
601 Error::InvalidMac(chacha20poly1305::Error),
602 Error::InvalidArgon2Type(u32::MAX)
603 );
604 assert_ne!(
605 Error::InvalidMac(chacha20poly1305::Error),
606 Error::InvalidArgon2Version(u32::MAX)
607 );
608 assert_ne!(
609 Error::InvalidMac(chacha20poly1305::Error),
610 Error::InvalidArgon2Params(argon2::Error::AdTooLong)
611 );
612 assert_ne!(
613 Error::InvalidMac(chacha20poly1305::Error),
614 Error::InvalidArgon2Context(argon2::Error::AdTooLong)
615 );
616 assert_ne!(
617 Error::InvalidMac(chacha20poly1305::Error),
618 Error::InvalidHeaderMac(MacError)
619 );
620 assert_eq!(
621 Error::InvalidMac(chacha20poly1305::Error),
622 Error::InvalidMac(chacha20poly1305::Error)
623 );
624 }
625
626 #[cfg(feature = "alloc")]
627 #[test]
628 fn display() {
629 assert_eq!(
630 format!("{}", Error::InvalidLength),
631 "encrypted data is shorter than 164 bytes"
632 );
633 assert_eq!(
634 format!("{}", Error::InvalidMagicNumber),
635 "invalid magic number"
636 );
637 assert_eq!(
638 format!("{}", Error::UnsupportedVersion(u8::MIN)),
639 "unsupported version number `0`"
640 );
641 assert_eq!(
642 format!("{}", Error::UnknownVersion(u8::MAX)),
643 "unknown version number `255`"
644 );
645 assert_eq!(
646 format!("{}", Error::InvalidArgon2Type(u32::MAX)),
647 "invalid Argon2 type"
648 );
649 assert_eq!(
650 format!("{}", Error::InvalidArgon2Version(u32::MAX)),
651 "invalid Argon2 version `0xffffffff`"
652 );
653 assert_eq!(
654 format!("{}", Error::InvalidArgon2Params(argon2::Error::AdTooLong)),
655 "invalid Argon2 parameters"
656 );
657 assert_eq!(
658 format!("{}", Error::InvalidArgon2Context(argon2::Error::AdTooLong)),
659 "invalid Argon2 context"
660 );
661 assert_eq!(
662 format!("{}", Error::InvalidHeaderMac(MacError)),
663 "invalid header MAC"
664 );
665 assert_eq!(
666 format!("{}", Error::InvalidMac(chacha20poly1305::Error)),
667 "invalid ciphertext MAC"
668 );
669 }
670
671 #[cfg(feature = "std")]
672 #[test]
673 fn source() {
674 use std::error::Error as _;
675
676 assert!(Error::InvalidLength.source().is_none());
677 assert!(Error::InvalidMagicNumber.source().is_none());
678 assert!(Error::UnsupportedVersion(u8::MIN).source().is_none());
679 assert!(Error::UnknownVersion(u8::MAX).source().is_none());
680 assert!(Error::InvalidArgon2Type(u32::MAX).source().is_none());
681 assert!(Error::InvalidArgon2Version(u32::MAX).source().is_none());
682 assert!(
683 Error::InvalidArgon2Params(argon2::Error::AdTooLong)
684 .source()
685 .unwrap()
686 .is::<argon2::Error>()
687 );
688 assert!(
689 Error::InvalidArgon2Context(argon2::Error::AdTooLong)
690 .source()
691 .unwrap()
692 .is::<argon2::Error>()
693 );
694 assert!(
695 Error::InvalidHeaderMac(MacError)
696 .source()
697 .unwrap()
698 .is::<MacError>()
699 );
700 assert!(
701 Error::InvalidMac(chacha20poly1305::Error)
702 .source()
703 .unwrap()
704 .is::<chacha20poly1305::Error>()
705 );
706 }
707
708 #[test]
709 fn from_mac_error_to_error() {
710 assert_eq!(Error::from(MacError), Error::InvalidHeaderMac(MacError));
711 }
712
713 #[test]
714 fn from_chacha20poly1305_error_to_error() {
715 assert_eq!(
716 Error::from(chacha20poly1305::Error),
717 Error::InvalidMac(chacha20poly1305::Error)
718 );
719 }
720
721 #[test]
722 fn result_type() {
723 assert_eq!(
724 any::type_name::<Result<()>>(),
725 any::type_name::<result::Result<(), Error>>()
726 );
727 assert_eq!(
728 any::type_name::<Result<u8>>(),
729 any::type_name::<result::Result<u8, Error>>()
730 );
731 }
732}