@@ -2,6 +2,7 @@ use crate::codec::{JsonCodec, JsonRpcCodec};
22pub use anyhow:: anyhow;
33use anyhow:: { Context , Result } ;
44use futures:: sink:: SinkExt ;
5+ use serde:: Serialize ;
56use tokio:: io:: { AsyncReadExt , AsyncWriteExt } ;
67extern crate log;
78use log:: trace;
@@ -204,12 +205,21 @@ where
204205 self . hooks . insert (
205206 hookname. to_string ( ) ,
206207 Hook {
208+ name : hookname. to_string ( ) ,
207209 callback : Box :: new ( move |p, r| Box :: pin ( callback ( p, r) ) ) ,
210+ before : Vec :: new ( ) ,
211+ after : Vec :: new ( ) ,
212+ filters : None ,
208213 } ,
209214 ) ;
210215 self
211216 }
212217
218+ pub fn hook_from_builder ( mut self , hook : HookBuilder < S > ) -> Builder < S , I , O > {
219+ self . hooks . insert ( hook. name . clone ( ) , hook. build ( ) ) ;
220+ self
221+ }
222+
213223 /// Register a custom RPC method for the RPC passthrough from the
214224 /// main daemon
215225 pub fn rpcmethod < C , F > ( mut self , name : & str , description : & str , callback : C ) -> Builder < S , I , O >
@@ -411,10 +421,21 @@ where
411421 . chain ( self . wildcard_subscription . iter ( ) . map ( |_| String :: from ( "*" ) ) )
412422 . collect ( ) ;
413423
424+ let hooks: Vec < messages:: Hook > = self
425+ . hooks
426+ . values ( )
427+ . map ( |v| messages:: Hook {
428+ name : v. name . clone ( ) ,
429+ before : v. before . clone ( ) ,
430+ after : v. after . clone ( ) ,
431+ filters : v. filters . clone ( ) ,
432+ } )
433+ . collect ( ) ;
434+
414435 messages:: GetManifestResponse {
415436 options : self . options . values ( ) . cloned ( ) . collect ( ) ,
416437 subscriptions,
417- hooks : self . hooks . keys ( ) . map ( |s| s . clone ( ) ) . collect ( ) ,
438+ hooks,
418439 rpcmethods,
419440 notifications : self . notifications . clone ( ) ,
420441 featurebits : self . featurebits . clone ( ) ,
@@ -458,6 +479,56 @@ where
458479 }
459480}
460481
482+ impl < S > HookBuilder < S >
483+ where
484+ S : Send + Clone ,
485+ {
486+ pub fn new < C , F > ( name : & str , callback : C ) -> Self
487+ where
488+ C : Send + Sync + ' static ,
489+ C : Fn ( Plugin < S > , Request ) -> F + ' static ,
490+ F : Future < Output = Response > + Send + ' static ,
491+ {
492+ Self {
493+ name : name. to_string ( ) ,
494+ callback : Box :: new ( move |p, r| Box :: pin ( callback ( p, r) ) ) ,
495+ before : Vec :: new ( ) ,
496+ after : Vec :: new ( ) ,
497+ filters : None ,
498+ }
499+ }
500+
501+ pub fn before ( mut self , before : Vec < String > ) -> Self {
502+ self . before = before;
503+ self
504+ }
505+
506+ pub fn after ( mut self , after : Vec < String > ) -> Self {
507+ self . after = after;
508+ self
509+ }
510+
511+ pub fn filters ( mut self , filters : Vec < HookFilter > ) -> Self {
512+ // Empty Vec would filter everything, must be None instead to not get serialized
513+ if filters. is_empty ( ) {
514+ self . filters = None ;
515+ } else {
516+ self . filters = Some ( filters) ;
517+ }
518+ self
519+ }
520+
521+ fn build ( self ) -> Hook < S > {
522+ Hook {
523+ callback : self . callback ,
524+ name : self . name ,
525+ before : self . before ,
526+ after : self . after ,
527+ filters : self . filters ,
528+ }
529+ }
530+ }
531+
461532impl < S > RpcMethodBuilder < S >
462533where
463534 S : Send + Clone ,
@@ -542,7 +613,29 @@ struct Hook<S>
542613where
543614 S : Clone + Send ,
544615{
616+ name : String ,
617+ callback : AsyncCallback < S > ,
618+ before : Vec < String > ,
619+ after : Vec < String > ,
620+ filters : Option < Vec < HookFilter > > ,
621+ }
622+
623+ pub struct HookBuilder < S >
624+ where
625+ S : Clone + Send ,
626+ {
627+ name : String ,
545628 callback : AsyncCallback < S > ,
629+ before : Vec < String > ,
630+ after : Vec < String > ,
631+ filters : Option < Vec < HookFilter > > ,
632+ }
633+
634+ #[ derive( Debug , Clone , Serialize ) ]
635+ #[ serde( untagged) ]
636+ pub enum HookFilter {
637+ Str ( String ) ,
638+ Int ( i64 ) ,
546639}
547640
548641impl < S > Plugin < S >
0 commit comments