@@ -166,7 +166,34 @@ impl<Pk: MiniscriptKey> ForEachKey<Pk> for Policy<Pk> {
166166impl < Pk : MiniscriptKey > Policy < Pk > {
167167 /// Convert a policy using one kind of public key to another
168168 /// 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+ /// ```
169188 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 >
170197 where
171198 Fpk : FnMut ( & Pk ) -> Result < Q , E > ,
172199 Q : MiniscriptKey ,
@@ -184,18 +211,18 @@ impl<Pk: MiniscriptKey> Policy<Pk> {
184211 Policy :: Threshold ( k, ref subs) => {
185212 let new_subs: Result < Vec < Policy < Q > > , _ > = subs
186213 . iter ( )
187- . map ( |sub| sub. translate_pk ( & mut translatefpk) )
214+ . map ( |sub| sub. _translate_pk ( translatefpk) )
188215 . collect ( ) ;
189216 new_subs. map ( |ok| Policy :: Threshold ( k, ok) )
190217 }
191218 Policy :: And ( ref subs) => Ok ( Policy :: And (
192219 subs. iter ( )
193- . map ( |sub| sub. translate_pk ( & mut translatefpk) )
220+ . map ( |sub| sub. _translate_pk ( translatefpk) )
194221 . collect :: < Result < Vec < Policy < Q > > , E > > ( ) ?,
195222 ) ) ,
196223 Policy :: Or ( ref subs) => Ok ( Policy :: Or (
197224 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) ?) ) )
199226 . collect :: < Result < Vec < ( usize , Policy < Q > ) > , E > > ( ) ?,
200227 ) ) ,
201228 }
0 commit comments