1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//! The [`LifecycleHook`] trait and [`PreHookResult`] enum.
use crateBoxFuture;
use HookContext;
use HookError;
/// Result of a pre-operation hook.
/// Trait for lifecycle hooks that run before and after CRUD operations.
///
/// All hooks must be `Send + Sync` for use across async tasks.
/// Methods use [`BoxFuture`] for object-safe async.
///
/// # Example
///
/// ```ignore
/// struct AuditLogger;
///
/// impl LifecycleHook for AuditLogger {
/// fn name(&self) -> &str { "audit-logger" }
///
/// fn before_operation<'a>(
/// &'a self,
/// ctx: &'a mut HookContext,
/// ) -> BoxFuture<'a, Result<PreHookResult, HookError>> {
/// Box::pin(async move {
/// tracing::info!(type_name = ctx.type_name, "Before operation");
/// Ok(PreHookResult::Continue)
/// })
/// }
///
/// fn after_operation<'a>(
/// &'a self,
/// ctx: &'a HookContext,
/// ) -> BoxFuture<'a, Result<(), HookError>> {
/// Box::pin(async move {
/// tracing::info!(type_name = ctx.type_name, "After operation");
/// Ok(())
/// })
/// }
/// }
/// ```