@@ -166,7 +166,34 @@ impl<Pk: MiniscriptKey> ForEachKey<Pk> for Policy<Pk> {
166
166
impl < Pk : MiniscriptKey > Policy < Pk > {
167
167
/// Convert a policy using one kind of public key to another
168
168
/// type of public key
169
+ ///
170
+ /// # Example
171
+ ///
172
+ /// ```
173
+ /// use miniscript::{bitcoin::PublicKey, policy::concrete::Policy};
174
+ /// use std::str::FromStr;
175
+ /// let alice_key = "0270cf3c71f65a3d93d285d9149fddeeb638f87a2d4d8cf16c525f71c417439777";
176
+ /// let bob_key = "02f43b15c50a436f5335dbea8a64dd3b4e63e34c3b50c42598acb5f4f336b5d2fb";
177
+ /// let placeholder_policy = Policy::<String>::from_str("and(pk(alice_key),pk(bob_key))").unwrap();
178
+ ///
179
+ /// let real_policy = placeholder_policy.translate_pk(|placeholder: &String| match placeholder.as_str() {
180
+ /// "alice_key" => PublicKey::from_str(alice_key),
181
+ /// "bob_key" => PublicKey::from_str(bob_key),
182
+ /// _ => panic!("unknown key!")
183
+ /// }).unwrap();
184
+ ///
185
+ /// let expected_policy = Policy::from_str(&format!("and(pk({}),pk({}))", alice_key, bob_key)).unwrap();
186
+ /// assert_eq!(real_policy, expected_policy);
187
+ /// ```
169
188
pub fn translate_pk < Fpk , Q , E > ( & self , mut translatefpk : Fpk ) -> Result < Policy < Q > , E >
189
+ where
190
+ Fpk : FnMut ( & Pk ) -> Result < Q , E > ,
191
+ Q : MiniscriptKey ,
192
+ {
193
+ self . _translate_pk ( & mut translatefpk)
194
+ }
195
+
196
+ fn _translate_pk < Fpk , Q , E > ( & self , translatefpk : & mut Fpk ) -> Result < Policy < Q > , E >
170
197
where
171
198
Fpk : FnMut ( & Pk ) -> Result < Q , E > ,
172
199
Q : MiniscriptKey ,
@@ -184,18 +211,18 @@ impl<Pk: MiniscriptKey> Policy<Pk> {
184
211
Policy :: Threshold ( k, ref subs) => {
185
212
let new_subs: Result < Vec < Policy < Q > > , _ > = subs
186
213
. iter ( )
187
- . map ( |sub| sub. translate_pk ( & mut translatefpk) )
214
+ . map ( |sub| sub. _translate_pk ( translatefpk) )
188
215
. collect ( ) ;
189
216
new_subs. map ( |ok| Policy :: Threshold ( k, ok) )
190
217
}
191
218
Policy :: And ( ref subs) => Ok ( Policy :: And (
192
219
subs. iter ( )
193
- . map ( |sub| sub. translate_pk ( & mut translatefpk) )
220
+ . map ( |sub| sub. _translate_pk ( translatefpk) )
194
221
. collect :: < Result < Vec < Policy < Q > > , E > > ( ) ?,
195
222
) ) ,
196
223
Policy :: Or ( ref subs) => Ok ( Policy :: Or (
197
224
subs. iter ( )
198
- . map ( |& ( ref prob, ref sub) | Ok ( ( * prob, sub. translate_pk ( & mut translatefpk) ?) ) )
225
+ . map ( |& ( ref prob, ref sub) | Ok ( ( * prob, sub. _translate_pk ( translatefpk) ?) ) )
199
226
. collect :: < Result < Vec < ( usize , Policy < Q > ) > , E > > ( ) ?,
200
227
) ) ,
201
228
}
0 commit comments