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
use crate::;
use async_trait;
/// Query Bus abstraction for the CQRS read side.
///
/// The query bus routes a strongly typed query `Q` to the
/// [`crate::query_handler::QueryHandler`] registered for that `(Q, R)` pair
/// and returns the produced result `R` to the caller. It is the symmetric
/// counterpart of [`crate::command_bus::CommandBus`] and lives on the read
/// path: handlers should consult read models / projections rather than
/// mutate aggregates.
///
/// # Implementation notes
///
/// - Implementations may target in-process dispatch (see
/// [`crate::InMemoryQueryBus`]) or cross-process query routing.
/// - The same query type may produce different result types — the
/// `(query type, result type)` pair forms the lookup key in the in-memory
/// implementation, allowing multiple read models to coexist.
/// - Implementations must be `Send + Sync`.
///
/// # Errors
///
/// Methods return [`AppError`]. Typical failure modes include
/// `HANDLER_NOT_FOUND` when nothing is registered for the requested
/// `(Q, R)` pair, `TYPE_MISMATCH` when the result returned by the handler
/// cannot be downcast to `R`, and any error surfaced by the handler itself.