1use std::{marker::PhantomData, rc::Rc};
5
6use crate::{
7 interceptor::{
8 Chain, InterceptorChain, NamespaceDefPostCreateInterceptor, NamespaceDefPostUpdateInterceptor,
9 NamespaceDefPreDeleteInterceptor, NamespaceDefPreUpdateInterceptor, PostCommitInterceptor,
10 PreCommitInterceptor, RingBufferDefPostCreateInterceptor, RingBufferDefPostUpdateInterceptor,
11 RingBufferDefPreDeleteInterceptor, RingBufferDefPreUpdateInterceptor, RingBufferPostDeleteInterceptor,
12 RingBufferPostInsertInterceptor, RingBufferPostUpdateInterceptor, RingBufferPreDeleteInterceptor,
13 RingBufferPreInsertInterceptor, RingBufferPreUpdateInterceptor, TableDefPostCreateInterceptor,
14 TableDefPostUpdateInterceptor, TableDefPreDeleteInterceptor, TableDefPreUpdateInterceptor,
15 TablePostDeleteInterceptor, TablePostInsertInterceptor, TablePostUpdateInterceptor,
16 TablePreDeleteInterceptor, TablePreInsertInterceptor, TablePreUpdateInterceptor,
17 ViewDefPostCreateInterceptor, ViewDefPostUpdateInterceptor, ViewDefPreDeleteInterceptor,
18 ViewDefPreUpdateInterceptor, ViewPostDeleteInterceptor, ViewPostInsertInterceptor,
19 ViewPostUpdateInterceptor, ViewPreDeleteInterceptor, ViewPreInsertInterceptor,
20 ViewPreUpdateInterceptor,
21 },
22 interface::CommandTransaction,
23};
24
25pub struct Interceptors<CT: CommandTransaction> {
27 pub table_pre_insert: Chain<CT, dyn TablePreInsertInterceptor<CT>>,
29 pub table_post_insert: Chain<CT, dyn TablePostInsertInterceptor<CT>>,
30 pub table_pre_update: Chain<CT, dyn TablePreUpdateInterceptor<CT>>,
31 pub table_post_update: Chain<CT, dyn TablePostUpdateInterceptor<CT>>,
32 pub table_pre_delete: Chain<CT, dyn TablePreDeleteInterceptor<CT>>,
33 pub table_post_delete: Chain<CT, dyn TablePostDeleteInterceptor<CT>>,
34 pub ring_buffer_pre_insert: Chain<CT, dyn RingBufferPreInsertInterceptor<CT>>,
36 pub ring_buffer_post_insert: Chain<CT, dyn RingBufferPostInsertInterceptor<CT>>,
37 pub ring_buffer_pre_update: Chain<CT, dyn RingBufferPreUpdateInterceptor<CT>>,
38 pub ring_buffer_post_update: Chain<CT, dyn RingBufferPostUpdateInterceptor<CT>>,
39 pub ring_buffer_pre_delete: Chain<CT, dyn RingBufferPreDeleteInterceptor<CT>>,
40 pub ring_buffer_post_delete: Chain<CT, dyn RingBufferPostDeleteInterceptor<CT>>,
41 pub pre_commit: Chain<CT, dyn PreCommitInterceptor<CT>>,
43 pub post_commit: Chain<CT, dyn PostCommitInterceptor<CT>>,
44 pub namespace_def_post_create: Chain<CT, dyn NamespaceDefPostCreateInterceptor<CT>>,
46 pub namespace_def_pre_update: Chain<CT, dyn NamespaceDefPreUpdateInterceptor<CT>>,
47 pub namespace_def_post_update: Chain<CT, dyn NamespaceDefPostUpdateInterceptor<CT>>,
48 pub namespace_def_pre_delete: Chain<CT, dyn NamespaceDefPreDeleteInterceptor<CT>>,
49 pub table_def_post_create: Chain<CT, dyn TableDefPostCreateInterceptor<CT>>,
51 pub table_def_pre_update: Chain<CT, dyn TableDefPreUpdateInterceptor<CT>>,
52 pub table_def_post_update: Chain<CT, dyn TableDefPostUpdateInterceptor<CT>>,
53 pub table_def_pre_delete: Chain<CT, dyn TableDefPreDeleteInterceptor<CT>>,
54 pub view_def_post_create: Chain<CT, dyn ViewDefPostCreateInterceptor<CT>>,
56 pub view_def_pre_update: Chain<CT, dyn ViewDefPreUpdateInterceptor<CT>>,
57 pub view_def_post_update: Chain<CT, dyn ViewDefPostUpdateInterceptor<CT>>,
58 pub view_def_pre_delete: Chain<CT, dyn ViewDefPreDeleteInterceptor<CT>>,
59 pub ring_buffer_def_post_create: Chain<CT, dyn RingBufferDefPostCreateInterceptor<CT>>,
61 pub ring_buffer_def_pre_update: Chain<CT, dyn RingBufferDefPreUpdateInterceptor<CT>>,
62 pub ring_buffer_def_post_update: Chain<CT, dyn RingBufferDefPostUpdateInterceptor<CT>>,
63 pub ring_buffer_def_pre_delete: Chain<CT, dyn RingBufferDefPreDeleteInterceptor<CT>>,
64 pub view_pre_insert: Chain<CT, dyn ViewPreInsertInterceptor<CT>>,
66 pub view_post_insert: Chain<CT, dyn ViewPostInsertInterceptor<CT>>,
67 pub view_pre_update: Chain<CT, dyn ViewPreUpdateInterceptor<CT>>,
68 pub view_post_update: Chain<CT, dyn ViewPostUpdateInterceptor<CT>>,
69 pub view_pre_delete: Chain<CT, dyn ViewPreDeleteInterceptor<CT>>,
70 pub view_post_delete: Chain<CT, dyn ViewPostDeleteInterceptor<CT>>,
71 _not_send_sync: PhantomData<*const ()>,
73}
74
75impl<CT: CommandTransaction> Default for Interceptors<CT> {
76 fn default() -> Self {
77 Self::new()
78 }
79}
80
81impl<CT: CommandTransaction> Interceptors<CT> {
82 pub fn new() -> Self {
83 Self {
84 table_pre_insert: InterceptorChain::new(),
85 table_post_insert: InterceptorChain::new(),
86 table_pre_update: InterceptorChain::new(),
87 table_post_update: InterceptorChain::new(),
88 table_pre_delete: InterceptorChain::new(),
89 table_post_delete: InterceptorChain::new(),
90 ring_buffer_pre_insert: InterceptorChain::new(),
91 ring_buffer_post_insert: InterceptorChain::new(),
92 ring_buffer_pre_update: InterceptorChain::new(),
93 ring_buffer_post_update: InterceptorChain::new(),
94 ring_buffer_pre_delete: InterceptorChain::new(),
95 ring_buffer_post_delete: InterceptorChain::new(),
96 pre_commit: InterceptorChain::new(),
97 post_commit: InterceptorChain::new(),
98 namespace_def_post_create: InterceptorChain::new(),
99 namespace_def_pre_update: InterceptorChain::new(),
100 namespace_def_post_update: InterceptorChain::new(),
101 namespace_def_pre_delete: InterceptorChain::new(),
102 table_def_post_create: InterceptorChain::new(),
103 table_def_pre_update: InterceptorChain::new(),
104 table_def_post_update: InterceptorChain::new(),
105 table_def_pre_delete: InterceptorChain::new(),
106 view_def_post_create: InterceptorChain::new(),
107 view_def_pre_update: InterceptorChain::new(),
108 view_def_post_update: InterceptorChain::new(),
109 view_def_pre_delete: InterceptorChain::new(),
110 ring_buffer_def_post_create: InterceptorChain::new(),
111 ring_buffer_def_pre_update: InterceptorChain::new(),
112 ring_buffer_def_post_update: InterceptorChain::new(),
113 ring_buffer_def_pre_delete: InterceptorChain::new(),
114 view_pre_insert: InterceptorChain::new(),
115 view_post_insert: InterceptorChain::new(),
116 view_pre_update: InterceptorChain::new(),
117 view_post_update: InterceptorChain::new(),
118 view_pre_delete: InterceptorChain::new(),
119 view_post_delete: InterceptorChain::new(),
120 _not_send_sync: PhantomData,
121 }
122 }
123}
124
125impl<CT: CommandTransaction> Clone for Interceptors<CT> {
126 fn clone(&self) -> Self {
127 Self {
128 table_pre_insert: self.table_pre_insert.clone(),
129 table_post_insert: self.table_post_insert.clone(),
130 table_pre_update: self.table_pre_update.clone(),
131 table_post_update: self.table_post_update.clone(),
132 table_pre_delete: self.table_pre_delete.clone(),
133 table_post_delete: self.table_post_delete.clone(),
134 ring_buffer_pre_insert: self.ring_buffer_pre_insert.clone(),
135 ring_buffer_post_insert: self.ring_buffer_post_insert.clone(),
136 ring_buffer_pre_update: self.ring_buffer_pre_update.clone(),
137 ring_buffer_post_update: self.ring_buffer_post_update.clone(),
138 ring_buffer_pre_delete: self.ring_buffer_pre_delete.clone(),
139 ring_buffer_post_delete: self.ring_buffer_post_delete.clone(),
140 pre_commit: self.pre_commit.clone(),
141 post_commit: self.post_commit.clone(),
142 namespace_def_post_create: self.namespace_def_post_create.clone(),
143 namespace_def_pre_update: self.namespace_def_pre_update.clone(),
144 namespace_def_post_update: self.namespace_def_post_update.clone(),
145 namespace_def_pre_delete: self.namespace_def_pre_delete.clone(),
146 table_def_post_create: self.table_def_post_create.clone(),
147 table_def_pre_update: self.table_def_pre_update.clone(),
148 table_def_post_update: self.table_def_post_update.clone(),
149 table_def_pre_delete: self.table_def_pre_delete.clone(),
150 view_def_post_create: self.view_def_post_create.clone(),
151 view_def_pre_update: self.view_def_pre_update.clone(),
152 view_def_post_update: self.view_def_post_update.clone(),
153 view_def_pre_delete: self.view_def_pre_delete.clone(),
154 ring_buffer_def_post_create: self.ring_buffer_def_post_create.clone(),
155 ring_buffer_def_pre_update: self.ring_buffer_def_pre_update.clone(),
156 ring_buffer_def_post_update: self.ring_buffer_def_post_update.clone(),
157 ring_buffer_def_pre_delete: self.ring_buffer_def_pre_delete.clone(),
158 view_pre_insert: self.view_pre_insert.clone(),
159 view_post_insert: self.view_post_insert.clone(),
160 view_pre_update: self.view_pre_update.clone(),
161 view_post_update: self.view_post_update.clone(),
162 view_pre_delete: self.view_pre_delete.clone(),
163 view_post_delete: self.view_post_delete.clone(),
164 _not_send_sync: PhantomData,
165 }
166 }
167}
168
169impl<CT: CommandTransaction> Interceptors<CT> {
170 pub fn register<I>(&mut self, interceptor: I)
173 where
174 I: super::RegisterInterceptor<CT> + 'static,
175 {
176 Rc::new(interceptor).register(self);
177 }
178}