@@ -22,7 +22,7 @@ use crate::prelude::*;
2222use crate :: util:: varint_len;
2323use crate :: {
2424 Error , ForEachKey , FromStrKey , Miniscript , MiniscriptKey , Satisfier , Segwitv0 , ToPublicKey ,
25- TranslateErr , TranslatePk , Translator ,
25+ TranslateErr , Translator ,
2626} ;
2727/// A Segwitv0 wsh descriptor
2828#[ derive( Clone , Ord , PartialOrd , Eq , PartialEq , Hash ) ]
@@ -128,6 +128,19 @@ impl<Pk: MiniscriptKey> Wsh<Pk> {
128128 varint_len ( max_sat_elems) +
129129 max_sat_size)
130130 }
131+
132+ /// Converts the keys in a script from one type to another.
133+ pub fn translate_pk < Q , T , E > ( & self , t : & mut T ) -> Result < Wsh < Q > , TranslateErr < E > >
134+ where
135+ T : Translator < Pk , Q , E > ,
136+ Q : MiniscriptKey ,
137+ {
138+ let inner = match self . inner {
139+ WshInner :: SortedMulti ( ref smv) => WshInner :: SortedMulti ( smv. translate_pk ( t) ?) ,
140+ WshInner :: Ms ( ref ms) => WshInner :: Ms ( ms. translate_pk ( t) ?) ,
141+ } ;
142+ Ok ( Wsh { inner } )
143+ }
131144}
132145
133146impl < Pk : MiniscriptKey + ToPublicKey > Wsh < Pk > {
@@ -291,25 +304,6 @@ impl<Pk: MiniscriptKey> ForEachKey<Pk> for Wsh<Pk> {
291304 }
292305}
293306
294- impl < P , Q > TranslatePk < P , Q > for Wsh < P >
295- where
296- P : MiniscriptKey ,
297- Q : MiniscriptKey ,
298- {
299- type Output = Wsh < Q > ;
300-
301- fn translate_pk < T , E > ( & self , t : & mut T ) -> Result < Self :: Output , TranslateErr < E > >
302- where
303- T : Translator < P , Q , E > ,
304- {
305- let inner = match self . inner {
306- WshInner :: SortedMulti ( ref smv) => WshInner :: SortedMulti ( smv. translate_pk ( t) ?) ,
307- WshInner :: Ms ( ref ms) => WshInner :: Ms ( ms. translate_pk ( t) ?) ,
308- } ;
309- Ok ( Wsh { inner } )
310- }
311- }
312-
313307/// A bare Wpkh descriptor at top level
314308#[ derive( Clone , Ord , PartialOrd , Eq , PartialEq , Hash ) ]
315309pub struct Wpkh < Pk : MiniscriptKey > {
@@ -370,6 +364,19 @@ impl<Pk: MiniscriptKey> Wpkh<Pk> {
370364 note = "Use max_weight_to_satisfy instead. The method to count bytes was redesigned and the results will differ from max_weight_to_satisfy. For more details check rust-bitcoin/rust-miniscript#476."
371365 ) ]
372366 pub fn max_satisfaction_weight ( & self ) -> usize { 4 + 1 + 73 + Segwitv0 :: pk_len ( & self . pk ) }
367+
368+ /// Converts the keys in a script from one type to another.
369+ pub fn translate_pk < Q , T , E > ( & self , t : & mut T ) -> Result < Wpkh < Q > , TranslateErr < E > >
370+ where
371+ T : Translator < Pk , Q , E > ,
372+ Q : MiniscriptKey ,
373+ {
374+ let res = Wpkh :: new ( t. pk ( & self . pk ) ?) ;
375+ match res {
376+ Ok ( pk) => Ok ( pk) ,
377+ Err ( e) => Err ( TranslateErr :: OuterError ( Error :: from ( e) ) ) ,
378+ }
379+ }
373380}
374381
375382impl < Pk : MiniscriptKey + ToPublicKey > Wpkh < Pk > {
@@ -509,22 +516,3 @@ impl<Pk: FromStrKey> core::str::FromStr for Wpkh<Pk> {
509516impl < Pk : MiniscriptKey > ForEachKey < Pk > for Wpkh < Pk > {
510517 fn for_each_key < ' a , F : FnMut ( & ' a Pk ) -> bool > ( & ' a self , mut pred : F ) -> bool { pred ( & self . pk ) }
511518}
512-
513- impl < P , Q > TranslatePk < P , Q > for Wpkh < P >
514- where
515- P : MiniscriptKey ,
516- Q : MiniscriptKey ,
517- {
518- type Output = Wpkh < Q > ;
519-
520- fn translate_pk < T , E > ( & self , t : & mut T ) -> Result < Self :: Output , TranslateErr < E > >
521- where
522- T : Translator < P , Q , E > ,
523- {
524- let res = Wpkh :: new ( t. pk ( & self . pk ) ?) ;
525- match res {
526- Ok ( pk) => Ok ( pk) ,
527- Err ( e) => Err ( TranslateErr :: OuterError ( Error :: from ( e) ) ) ,
528- }
529- }
530- }
0 commit comments