@@ -443,6 +443,10 @@ where K::Err: core::error::Error
443443////////////////////////////////////////
444444// Combinators
445445
446+ fn trim_start_expr < ' s > ( s : & ' s str , expr : & ' static str ) -> Option < & ' s str > {
447+ s. trim_start ( ) . strip_prefix ( expr) . and_then ( |rest| rest. trim_start ( ) . strip_prefix ( "(" ) )
448+ }
449+
446450impl < K : DeriveSet + Display + FromStr > FromStr for Sh < K >
447451where
448452 K :: Err : core:: error:: Error ,
@@ -452,11 +456,14 @@ where
452456 type Err = DescrParseError < K :: Err > ;
453457
454458 fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
455- if s. starts_with ( "sh(wsh(" ) {
459+ let Some ( rest) = trim_start_expr ( s, "sh" ) else {
460+ return Err ( DescrParseError :: NoRequiredScript ( "sh" ) ) ;
461+ } ;
462+ if rest. starts_with ( "wsh" ) {
456463 Ok ( ShWsh :: from_str ( s) ?. into ( ) )
457- } else if s . starts_with ( "sh( sortedmulti( " ) {
464+ } else if rest . starts_with ( "sortedmulti" ) {
458465 ShSortedMulti :: from_str ( s) . map ( Sh :: ShSortedMulti )
459- } else if s . starts_with ( "sh( multi( " ) {
466+ } else if rest . starts_with ( "multi" ) {
460467 ShMulti :: from_str ( s) . map ( Sh :: ShMulti )
461468 } else {
462469 ShScript :: from_str ( s) . map ( Sh :: ShScript )
@@ -470,9 +477,13 @@ where K::Err: core::error::Error
470477 type Err = DescrParseError < K :: Err > ;
471478
472479 fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
473- if s. starts_with ( "wsh(multi(" ) {
480+ let Some ( rest) = trim_start_expr ( s, "wsh" ) else {
481+ return Err ( DescrParseError :: NoRequiredScript ( "wsh" ) ) ;
482+ } ;
483+ let rest = rest. trim_start ( ) ;
484+ if rest. starts_with ( "multi" ) {
474485 WshMulti :: from_str ( s) . map ( Wsh :: Multi )
475- } else if s . starts_with ( "wsh( sortedmulti( " ) {
486+ } else if rest . starts_with ( "sortedmulti" ) {
476487 WshSortedMulti :: from_str ( s) . map ( Wsh :: SortedMulti )
477488 } else {
478489 WshScript :: from_str ( s) . map ( Wsh :: Script )
@@ -486,14 +497,18 @@ where K::Err: core::error::Error
486497 type Err = DescrParseError < K :: Err > ;
487498
488499 fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
489- if s. starts_with ( "sh(wsh(multi(" ) {
500+ let Some ( rest) = trim_start_expr ( s, "sh" ) else {
501+ return Err ( DescrParseError :: NoRequiredScript ( "sh" ) ) ;
502+ } ;
503+ let Some ( rest) = trim_start_expr ( rest, "wsh" ) else {
504+ return Err ( DescrParseError :: NoRequiredScript ( "wsh" ) ) ;
505+ } ;
506+ if rest. starts_with ( "multi" ) {
490507 ShWshMulti :: from_str ( s) . map ( ShWsh :: Multi )
491- } else if s . starts_with ( "sh(wsh( sortedmulti( " ) {
508+ } else if rest . starts_with ( "sortedmulti" ) {
492509 ShWshSortedMulti :: from_str ( s) . map ( ShWsh :: SortedMulti )
493- } else if s. starts_with ( "sh(wsh(" ) {
494- ShWshScript :: from_str ( s) . map ( ShWsh :: Script )
495510 } else {
496- Err ( DescrParseError :: InvalidScriptExpr ( s . to_owned ( ) ) )
511+ ShWshScript :: from_str ( s ) . map ( ShWsh :: Script )
497512 }
498513 }
499514}
@@ -526,7 +541,7 @@ where
526541 type Err = DescrParseError < K :: Err > ;
527542
528543 fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
529- Ok ( match s {
544+ Ok ( match s. trim_start ( ) {
530545 s if s. starts_with ( "pkh" ) => Self :: Pkh ( Pkh :: from_str ( s) ?) ,
531546 s if s. starts_with ( "wpkh" ) => Self :: Wpkh ( Wpkh :: from_str ( s) ?) ,
532547
0 commit comments