v / vlib / net / jsonrpc / interceptors.v
100 lines · 86 sloc · 2.75 KB · f53920bcec4f43594143c41772b42b6465f1c6a9
Raw
1module jsonrpc
2
3// EventInterceptor called on `jsonrpc.dispatch_event`
4pub type EventInterceptor = fn (name string, data string)
5
6// EncodedRequestInterceptor called on `jsonrpc.intercept_encoded_request`
7pub type EncodedRequestInterceptor = fn (req []u8) !
8
9// RequestInterceptor called on `jsonrpc.intercept_request`
10pub type RequestInterceptor = fn (req &Request) !
11
12// ResponseInterceptor called on `jsonrpc.intercept_response`
13pub type ResponseInterceptor = fn (resp &Response)
14
15// EncodedResponseInterceptor called on `jsonrpc.intercept_encoded_response`
16pub type EncodedResponseInterceptor = fn (resp []u8)
17
18// Interceptors collection of all supported interceptors to be called on events
19pub struct Interceptors {
20pub mut:
21 event []EventInterceptor
22 encoded_request []EncodedRequestInterceptor
23 request []RequestInterceptor
24 response []ResponseInterceptor
25 encoded_response []EncodedResponseInterceptor
26}
27
28// dispatch_event sends `event_name` and `data` to provided `jsonrpc.EventInterceptor`s
29pub fn dispatch_event(ints []EventInterceptor, event_name string, data string) {
30 for i in ints {
31 i(event_name, data)
32 }
33}
34
35// intercept_encoded_request sends raw request data before attempting
36// to decode it into `jsonrpc.Request` to provided `jsonrpc.EncodedRequestInterceptor`s
37pub fn intercept_encoded_request(ints []EncodedRequestInterceptor, req []u8) ! {
38 for i in ints {
39 i(req)!
40 }
41}
42
43// intercept_request sends decoded `jsonrpc.Request` to provided `jsonrpc.RequestInterceptor`s
44pub fn intercept_request(ints []RequestInterceptor, req &Request) ! {
45 for i in ints {
46 i(req)!
47 }
48}
49
50// intercept_response sends decoded `jsonrpc.Response` to provided `jsonrpc.ResponseInterceptor`s
51pub fn intercept_response(ints []ResponseInterceptor, resp &Response) {
52 for i in ints {
53 i(resp)
54 }
55}
56
57// intercept_encoded_response sends raw encoded data representing
58// `jsonrpc.Response` to provided `jsonrpc.EncodedResponseInterceptor`s
59pub fn intercept_encoded_response(ints []EncodedResponseInterceptor, resp []u8) {
60 for i in ints {
61 i(resp)
62 }
63}
64
65// is_interceptor_enabled checks if interceptor of provided type is enabled on `jsonrpc.Server`
66pub fn (s &Server) is_interceptor_enabled[T]() bool {
67 s.get_interceptor[T]() or { return false }
68 return true
69}
70
71// get_interceptor tries to find and return interceptor of provided type from `jsonrpc.Interceptors`
72pub fn (i Interceptors) get_interceptor[T]() ?&T {
73 for inter in i.event {
74 if inter is T {
75 return inter
76 }
77 }
78 for inter in i.encoded_request {
79 if inter is T {
80 return inter
81 }
82 }
83 for inter in i.request {
84 if inter is T {
85 return inter
86 }
87 }
88 for inter in i.response {
89 if inter is T {
90 return inter
91 }
92 }
93 for inter in i.encoded_response {
94 if inter is T {
95 return inter
96 }
97 }
98
99 return none
100}
101