@@ -343,128 +343,133 @@ impl hash::Hash for DummyKeyHash {
343
343
}
344
344
}
345
345
346
- /// Convert a descriptor using abstract keys to one using specific keys
347
- /// This will panic if translatefpk returns an uncompressed key when
348
- /// converting to a Segwit descriptor. To prevent this panic, ensure
349
- /// translatefpk returns an error in this case instead.
350
- pub trait TranslatePk < P : MiniscriptKey , Q : MiniscriptKey > {
351
- /// The associated output type. This must be Self<Q>
346
+ /// Converts a descriptor using abstract keys to one using specific keys.
347
+ ///
348
+ /// # Panics
349
+ ///
350
+ /// If `fpk` returns an uncompressed key when converting to a segwit descriptor.
351
+ /// To prevent this panic, ensure `fpk` returns an error in this case instead.
352
+ pub trait TranslatePk < P , Q >
353
+ where
354
+ P : MiniscriptKey ,
355
+ Q : MiniscriptKey ,
356
+ {
357
+ /// The associated output type. This must be `Self<Q>`.
352
358
type Output ;
353
359
354
- /// Translate a struct from one Generic to another where the
355
- /// translation for Pk is provided by translatefpk, and translation for
356
- /// PkH is provided by translatefpkh
357
- fn translate_pk < Fpk , Fpkh , E > (
358
- & self ,
359
- translatefpk : Fpk ,
360
- translatefpkh : Fpkh ,
361
- ) -> Result < Self :: Output , E >
360
+ /// Translates a struct from one generic to another where the translation
361
+ /// for Pk is provided by function `fpk`, and translation for PkH is
362
+ /// provided by function `fpkh`.
363
+ fn translate_pk < Fpk , Fpkh , E > ( & self , fpk : Fpk , fpkh : Fpkh ) -> Result < Self :: Output , E >
362
364
where
363
365
Fpk : FnMut ( & P ) -> Result < Q , E > ,
364
366
Fpkh : FnMut ( & P :: Hash ) -> Result < Q :: Hash , E > ;
365
367
366
- /// Calls `translate_pk` with conversion functions that cannot fail
367
- fn translate_pk_infallible < Fpk , Fpkh > (
368
- & self ,
369
- mut translatefpk : Fpk ,
370
- mut translatefpkh : Fpkh ,
371
- ) -> Self :: Output
368
+ /// Calls `Self::translate_pk` with conversion functions that cannot fail.
369
+ fn translate_pk_infallible < Fpk , Fpkh > ( & self , mut fpk : Fpk , mut fpkh : Fpkh ) -> Self :: Output
372
370
where
373
371
Fpk : FnMut ( & P ) -> Q ,
374
372
Fpkh : FnMut ( & P :: Hash ) -> Q :: Hash ,
375
373
{
376
- self . translate_pk :: < _ , _ , ( ) > ( |pk| Ok ( translatefpk ( pk) ) , |pkh| Ok ( translatefpkh ( pkh) ) )
374
+ self . translate_pk :: < _ , _ , ( ) > ( |pk| Ok ( fpk ( pk) ) , |pkh| Ok ( fpkh ( pkh) ) )
377
375
. expect ( "infallible translation function" )
378
376
}
379
377
}
380
378
381
379
/// Variant of `TranslatePk` where P and Q both have the same hash
382
- /// type, and the hashes can be converted by just cloning them
383
- pub trait TranslatePk1 < P : MiniscriptKey , Q : MiniscriptKey < Hash = P :: Hash > > :
384
- TranslatePk < P , Q >
380
+ /// type, and the hashes can be converted by just cloning them.
381
+ pub trait TranslatePk1 < P , Q > : TranslatePk < P , Q >
382
+ where
383
+ P : MiniscriptKey ,
384
+ Q : MiniscriptKey < Hash = P :: Hash > ,
385
385
{
386
- /// Translate a struct from one generic to another where the
387
- /// translation for Pk is provided by translatefpk
388
- fn translate_pk1 < Fpk , E > (
389
- & self ,
390
- translatefpk : Fpk ,
391
- ) -> Result < <Self as TranslatePk < P , Q > >:: Output , E >
386
+ /// Translates a struct from one generic to another where the translation
387
+ /// for Pk is provided by function `fpk`.
388
+ fn translate_pk1 < Fpk , E > ( & self , fpk : Fpk ) -> Result < <Self as TranslatePk < P , Q > >:: Output , E >
392
389
where
393
390
Fpk : FnMut ( & P ) -> Result < Q , E > ,
394
391
{
395
- self . translate_pk ( translatefpk , |h| Ok ( h. clone ( ) ) )
392
+ self . translate_pk ( fpk , |h| Ok ( h. clone ( ) ) )
396
393
}
397
394
398
- /// Translate a struct from one generic to another where the
399
- /// translation for Pk is provided by translatefpk
400
- fn translate_pk1_infallible < Fpk : FnMut ( & P ) -> Q > (
401
- & self ,
402
- translatefpk : Fpk ,
403
- ) -> < Self as TranslatePk < P , Q > > :: Output {
404
- self . translate_pk_infallible ( translatefpk , P :: Hash :: clone)
395
+ /// Translates a struct from one generic to another where the translation
396
+ /// for Pk is provided by function `fpk`.
397
+ fn translate_pk1_infallible < Fpk > ( & self , fpk : Fpk ) -> < Self as TranslatePk < P , Q > > :: Output
398
+ where
399
+ Fpk : FnMut ( & P ) -> Q ,
400
+ {
401
+ self . translate_pk_infallible ( fpk , P :: Hash :: clone)
405
402
}
406
403
}
407
- impl < P : MiniscriptKey , Q : MiniscriptKey < Hash = P :: Hash > , T : TranslatePk < P , Q > > TranslatePk1 < P , Q >
408
- for T
404
+ impl < P , Q , T > TranslatePk1 < P , Q > for T
405
+ where
406
+ P : MiniscriptKey ,
407
+ Q : MiniscriptKey < Hash = P :: Hash > ,
408
+ T : TranslatePk < P , Q > ,
409
409
{
410
410
}
411
411
412
412
/// Variant of `TranslatePk` where P's hash is P, so the hashes
413
- /// can be converted by reusing the key-conversion function
414
- pub trait TranslatePk2 < P : MiniscriptKey < Hash = P > , Q : MiniscriptKey > : TranslatePk < P , Q > {
415
- /// Translate a struct from one generic to another where the
416
- /// translation for Pk is provided by translatefpk
417
- fn translate_pk2 < Fpk : Fn ( & P ) -> Result < Q , E > , E > (
418
- & self ,
419
- translatefpk : Fpk ,
420
- ) -> Result < <Self as TranslatePk < P , Q > >:: Output , E > {
421
- self . translate_pk ( & translatefpk, |h| {
422
- translatefpk ( h) . map ( |q| q. to_pubkeyhash ( ) )
423
- } )
424
- }
425
-
426
- /// Translate a struct from one generic to another where the
427
- /// translation for Pk is provided by translatefpk
428
- fn translate_pk2_infallible < Fpk : Fn ( & P ) -> Q > (
429
- & self ,
430
- translatefpk : Fpk ,
431
- ) -> <Self as TranslatePk < P , Q > >:: Output {
432
- self . translate_pk_infallible ( & translatefpk, |h| translatefpk ( h) . to_pubkeyhash ( ) )
433
- }
434
- }
435
- impl < P : MiniscriptKey < Hash = P > , Q : MiniscriptKey , T : TranslatePk < P , Q > > TranslatePk2 < P , Q > for T { }
413
+ /// can be converted by reusing the key-conversion function.
414
+ pub trait TranslatePk2 < P , Q > : TranslatePk < P , Q >
415
+ where
416
+ P : MiniscriptKey < Hash = P > ,
417
+ Q : MiniscriptKey ,
418
+ {
419
+ /// Translates a struct from one generic to another where the translation
420
+ /// for Pk is provided by function `fpk`.
421
+ fn translate_pk2 < Fpk , E > ( & self , fpk : Fpk ) -> Result < <Self as TranslatePk < P , Q > >:: Output , E >
422
+ where
423
+ Fpk : Fn ( & P ) -> Result < Q , E > ,
424
+ {
425
+ self . translate_pk ( & fpk, |h| fpk ( h) . map ( |q| q. to_pubkeyhash ( ) ) )
426
+ }
427
+
428
+ /// Translates a struct from one generic to another where the translation
429
+ /// for Pk is provided by function `fpk`.
430
+ fn translate_pk2_infallible < Fpk > ( & self , fpk : Fpk ) -> <Self as TranslatePk < P , Q > >:: Output
431
+ where
432
+ Fpk : Fn ( & P ) -> Q ,
433
+ {
434
+ self . translate_pk_infallible ( & fpk, |h| fpk ( h) . to_pubkeyhash ( ) )
435
+ }
436
+ }
437
+ impl < P , Q , T > TranslatePk2 < P , Q > for T
438
+ where
439
+ P : MiniscriptKey < Hash = P > ,
440
+ Q : MiniscriptKey ,
441
+ T : TranslatePk < P , Q > ,
442
+ {
443
+ }
436
444
437
445
/// Variant of `TranslatePk` where Q's hash is `hash160` so we can
438
- /// derive hashes by calling `hash_to_hash160`
446
+ /// derive hashes by calling `hash_to_hash160`.
439
447
pub trait TranslatePk3 < P : MiniscriptKey + ToPublicKey , Q : MiniscriptKey < Hash = hash160:: Hash > > :
440
448
TranslatePk < P , Q >
441
449
{
442
- /// Translate a struct from one generic to another where the
443
- /// translation for Pk is provided by translatefpk
444
- fn translate_pk3 < Fpk , E > (
445
- & self ,
446
- translatefpk : Fpk ,
447
- ) -> Result < <Self as TranslatePk < P , Q > >:: Output , E >
450
+ /// Translates a struct from one generic to another where the translation
451
+ /// for Pk is provided by function `fpk`.
452
+ fn translate_pk3 < Fpk , E > ( & self , fpk : Fpk ) -> Result < <Self as TranslatePk < P , Q > >:: Output , E >
448
453
where
449
454
Fpk : FnMut ( & P ) -> Result < Q , E > ,
450
455
{
451
- self . translate_pk ( translatefpk , |h| Ok ( P :: hash_to_hash160 ( h) ) )
456
+ self . translate_pk ( fpk , |h| Ok ( P :: hash_to_hash160 ( h) ) )
452
457
}
453
458
454
- /// Translate a struct from one generic to another where the
455
- /// translation for Pk is provided by translatefpk
456
- fn translate_pk3_infallible < Fpk : FnMut ( & P ) -> Q > (
457
- & self ,
458
- translatefpk : Fpk ,
459
- ) -> < Self as TranslatePk < P , Q > > :: Output {
460
- self . translate_pk_infallible ( translatefpk , P :: hash_to_hash160)
459
+ /// Translates a struct from one generic to another where the translation
460
+ /// for Pk is provided by function `fpk`.
461
+ fn translate_pk3_infallible < Fpk > ( & self , fpk : Fpk ) -> < Self as TranslatePk < P , Q > > :: Output
462
+ where
463
+ Fpk : FnMut ( & P ) -> Q ,
464
+ {
465
+ self . translate_pk_infallible ( fpk , P :: hash_to_hash160)
461
466
}
462
467
}
463
- impl <
464
- P : MiniscriptKey + ToPublicKey ,
465
- Q : MiniscriptKey < Hash = hash160 :: Hash > ,
466
- T : TranslatePk < P , Q > ,
467
- > TranslatePk3 < P , Q > for T
468
+ impl < P , Q , T > TranslatePk3 < P , Q > for T
469
+ where
470
+ P : MiniscriptKey + ToPublicKey ,
471
+ Q : MiniscriptKey < Hash = hash160 :: Hash > ,
472
+ T : TranslatePk < P , Q > ,
468
473
{
469
474
}
470
475
0 commit comments