reifydb_core/interceptor/
interceptors.rs

1// Copyright (c) reifydb.com 2025
2// This file is licensed under the AGPL-3.0-or-later, see license.md file
3
4use 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
25/// Container for all interceptor chains
26pub struct Interceptors<CT: CommandTransaction> {
27	// Table data interceptors
28	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	// Ring buffer data interceptors
35	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	// Transaction interceptors
42	pub pre_commit: Chain<CT, dyn PreCommitInterceptor<CT>>,
43	pub post_commit: Chain<CT, dyn PostCommitInterceptor<CT>>,
44	// Namespace definition interceptors
45	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	// Table definition interceptors
50	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	// View definition interceptors
55	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	// Ring buffer definition interceptors
60	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	// View data interceptors
65	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	// Marker to prevent Send and Sync
72	_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	/// Register any interceptor - it will be added to all appropriate
171	/// chains based on which traits it implements
172	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}