@@ -401,51 +401,59 @@ fn check_hrp(hrp: &str) -> Result<Case, Error> {
401
401
///
402
402
/// # Errors
403
403
/// * If [check_hrp] returns an error for the given HRP.
404
- /// * If `fmt` fails on write
405
404
/// # Deviations from standard
406
405
/// * No length limits are enforced for the data part
407
406
pub fn encode_to_fmt < T : AsRef < [ u5 ] > > (
408
407
fmt : & mut fmt:: Write ,
409
408
hrp : & str ,
410
409
data : T ,
411
410
variant : Variant ,
412
- ) -> Result < ( ) , Error > {
411
+ ) -> Result < fmt :: Result , Error > {
413
412
let hrp_lower = match check_hrp ( hrp) ? {
414
413
Case :: Upper => Cow :: Owned ( hrp. to_lowercase ( ) ) ,
415
414
Case :: Lower | Case :: None => Cow :: Borrowed ( hrp) ,
416
415
} ;
417
416
418
- let mut writer = Bech32Writer :: new ( & hrp_lower, variant, fmt) ?;
419
- Ok ( writer. write ( data. as_ref ( ) ) . and_then ( |_| {
420
- // Finalize manually to avoid panic on drop if write fails
421
- writer. finalize ( )
422
- } ) ?)
417
+ match Bech32Writer :: new ( & hrp_lower, variant, fmt) {
418
+ Ok ( mut writer) => {
419
+ Ok ( writer. write ( data. as_ref ( ) ) . and_then ( |_| {
420
+ // Finalize manually to avoid panic on drop if write fails
421
+ writer. finalize ( )
422
+ } ) )
423
+ }
424
+ Err ( e) => Ok ( Err ( e) ) ,
425
+ }
423
426
}
424
427
425
428
/// Encode a bech32 payload without a checksum to an [fmt::Write].
426
429
/// This method is intended for implementing traits from [std::fmt].
427
430
///
428
431
/// # Errors
429
432
/// * If [check_hrp] returns an error for the given HRP.
430
- /// * If `fmt` fails on write
431
433
/// # Deviations from standard
432
434
/// * No length limits are enforced for the data part
433
435
pub fn encode_without_checksum_to_fmt < T : AsRef < [ u5 ] > > (
434
436
fmt : & mut fmt:: Write ,
435
437
hrp : & str ,
436
438
data : T ,
437
- ) -> Result < ( ) , Error > {
439
+ ) -> Result < fmt :: Result , Error > {
438
440
let hrp = match check_hrp ( hrp) ? {
439
441
Case :: Upper => Cow :: Owned ( hrp. to_lowercase ( ) ) ,
440
442
Case :: Lower | Case :: None => Cow :: Borrowed ( hrp) ,
441
443
} ;
442
444
443
- fmt. write_str ( & hrp) ?;
444
- fmt. write_char ( SEP ) ?;
445
+ if let Err ( e) = fmt. write_str ( & hrp) {
446
+ return Ok ( Err ( e) ) ;
447
+ }
448
+ if let Err ( e) = fmt. write_char ( SEP ) {
449
+ return Ok ( Err ( e) ) ;
450
+ }
445
451
for b in data. as_ref ( ) {
446
- fmt. write_char ( b. to_char ( ) ) ?;
452
+ if let Err ( e) = fmt. write_char ( b. to_char ( ) ) {
453
+ return Ok ( Err ( e) ) ;
454
+ }
447
455
}
448
- Ok ( ( ) )
456
+ Ok ( Ok ( ( ) ) )
449
457
}
450
458
451
459
/// Used for encode/decode operations for the two variants of Bech32
@@ -486,7 +494,7 @@ impl Variant {
486
494
/// * No length limits are enforced for the data part
487
495
pub fn encode < T : AsRef < [ u5 ] > > ( hrp : & str , data : T , variant : Variant ) -> Result < String , Error > {
488
496
let mut buf = String :: new ( ) ;
489
- encode_to_fmt ( & mut buf, hrp, data, variant) ?;
497
+ encode_to_fmt ( & mut buf, hrp, data, variant) ?. unwrap ( ) ;
490
498
Ok ( buf)
491
499
}
492
500
@@ -498,7 +506,7 @@ pub fn encode<T: AsRef<[u5]>>(hrp: &str, data: T, variant: Variant) -> Result<St
498
506
/// * No length limits are enforced for the data part
499
507
pub fn encode_without_checksum < T : AsRef < [ u5 ] > > ( hrp : & str , data : T ) -> Result < String , Error > {
500
508
let mut buf = String :: new ( ) ;
501
- encode_without_checksum_to_fmt ( & mut buf, hrp, data) ?;
509
+ encode_without_checksum_to_fmt ( & mut buf, hrp, data) ?. unwrap ( ) ;
502
510
Ok ( buf)
503
511
}
504
512
@@ -668,14 +676,6 @@ pub enum Error {
668
676
InvalidPadding ,
669
677
/// The whole string must be of one case
670
678
MixedCase ,
671
- /// Writing UTF-8 data failed
672
- WriteFailure ( fmt:: Error ) ,
673
- }
674
-
675
- impl From < fmt:: Error > for Error {
676
- fn from ( error : fmt:: Error ) -> Self {
677
- Self :: WriteFailure ( error)
678
- }
679
679
}
680
680
681
681
impl fmt:: Display for Error {
@@ -688,7 +688,6 @@ impl fmt::Display for Error {
688
688
Error :: InvalidData ( n) => write ! ( f, "invalid data point ({})" , n) ,
689
689
Error :: InvalidPadding => write ! ( f, "invalid padding" ) ,
690
690
Error :: MixedCase => write ! ( f, "mixed-case strings not allowed" ) ,
691
- Error :: WriteFailure ( _) => write ! ( f, "failed writing utf-8 data" ) ,
692
691
}
693
692
}
694
693
}
@@ -704,7 +703,6 @@ impl std::error::Error for Error {
704
703
Error :: InvalidData ( _) => "invalid data point" ,
705
704
Error :: InvalidPadding => "invalid padding" ,
706
705
Error :: MixedCase => "mixed-case strings not allowed" ,
707
- Error :: WriteFailure ( _) => "failed writing utf-8 data" ,
708
706
}
709
707
}
710
708
}
0 commit comments