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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
//! URL resolver trait for type-safe URL generation.
//!
//! This module provides the `UrlResolver` trait, the foundation for
//! compile-time type-safe URL resolution. View macros (`#[get]`, `#[post]`,
//! etc.) generate extension traits with blanket implementations that add
//! named accessor methods to any `UrlResolver` implementor.
//!
//! # Architecture
//!
//! ```text
//! #[get("/login/", name = "auth_login")]
//! ↓ (inventory registration)
//! UrlReverser::from_global().reverse("server:auth:login", &HashMap::new())
//! ```
//!
//! # Usage
//!
//! ```rust,ignore
//! let reverser = UrlReverser::from_global();
//! let login_url = reverser.reverse("server:auth:login", &HashMap::new())?;
//! let detail_url = reverser.reverse_with("server:clusters:retrieve", &[("id", "x")])?;
//! ```
/// Base trait for type-safe URL resolution.
///
/// Implementors provide URL lookup by route name and parameters.
/// Extension traits generated by view macros (`#[get]`, `#[post]`, etc.)
/// use this as a supertrait to add named accessor methods via blanket impls.
///
/// # Example
///
/// ```rust
/// use reinhardt_urls::routers::resolver::UrlResolver;
///
/// struct MyResolver;
///
/// impl UrlResolver for MyResolver {
/// fn resolve_url(&self, name: &str, params: &[(&str, &str)]) -> String {
/// format!("/{}/", name)
/// }
/// }
///
/// let resolver = MyResolver;
/// assert_eq!(resolver.resolve_url("home", &[]), "/home/");
/// ```
/// Trait for resolving client-side (frontend) URLs by route name.
///
/// This is the client-side counterpart to [`UrlResolver`]. While `UrlResolver`
/// resolves server-side API/backend routes, `ClientUrlResolver` resolves
/// frontend routes registered via `ClientRouter`.
///
/// # Panics
///
/// Implementations should panic if the route name is not found, consistent
/// with [`UrlResolver::resolve_url()`].
///
/// # Example
///
/// ```rust
/// use reinhardt_urls::routers::resolver::ClientUrlResolver;
///
/// struct MyClientResolver;
///
/// impl ClientUrlResolver for MyClientResolver {
/// fn resolve_client_url(&self, name: &str, params: &[(&str, &str)]) -> String {
/// format!("/client/{}/", name)
/// }
/// }
///
/// let resolver = MyClientResolver;
/// assert_eq!(resolver.resolve_client_url("home", &[]), "/client/home/");
/// ```
// `StreamingTopicResolver` is defined canonically in `reinhardt-streaming`
// and re-exported from `crate::routers` (see routers.rs) to keep a single
// source of truth. The `#[producer]`/`#[consumer]` macros implement the
// `reinhardt-streaming` trait directly.
/// Trait for resolving WebSocket endpoint URLs by route name.
///
/// Parallel to [`UrlResolver`] for HTTP routes. Extension traits generated by
/// `#[websocket]` use this as a supertrait to add named accessor methods via
/// blanket impls.
///
/// # Panics
///
/// Implementations should panic if the route name is not registered.
///
/// # Example
///
/// ```rust
/// use reinhardt_urls::routers::resolver::WebSocketUrlResolver;
///
/// struct MyWsResolver;
///
/// impl WebSocketUrlResolver for MyWsResolver {
/// fn resolve_ws_url(&self, name: &str, params: &[(&str, &str)]) -> String {
/// format!("/ws/{}/", name)
/// }
/// }
///
/// let resolver = MyWsResolver;
/// assert_eq!(resolver.resolve_ws_url("chat", &[]), "/ws/chat/");
/// ```