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
//! Typed extractors for authenticated users
//!
//! Provides `AuthUser<T>` and `OptionalUser<T>` for handler parameter injection,
//! eliminating boilerplate `Auth::user_as::<T>()` calls.
//!
//! # Example
//!
//! ```rust,ignore
//! use ferro_rs::{handler, AuthUser, OptionalUser, Response};
//!
//! #[handler]
//! pub async fn dashboard(user: AuthUser<User>) -> Response {
//! // `user` is guaranteed to be authenticated
//! // Returns 401 automatically if not
//! json_response!({ "name": user.name })
//! }
//!
//! #[handler]
//! pub async fn home(user: OptionalUser<User>) -> Response {
//! match user.as_ref() {
//! Some(u) => json_response!({ "greeting": format!("Hello, {}!", u.name) }),
//! None => json_response!({ "greeting": "Hello, guest!" }),
//! }
//! }
//! ```
//!
//! # Limitations
//!
//! These extractors use the `FromRequest` trait which takes ownership of the
//! request. This means they cannot be combined with `FormRequest` types or
//! `Request` in the same handler signature. If you need both auth and request
//! body, use `Auth::user_as::<T>()` manually in the handler body.
use Deref;
use async_trait;
use Authenticatable;
use Auth;
use crateFrameworkError;
use crateFromRequest;
use crateRequest;
/// Extracts the authenticated user, returning 401 if not authenticated.
///
/// Use this in handler signatures where authentication is required.
/// The handler macro will automatically extract the user from the session.
///
/// # Type Parameters
///
/// * `T` - The concrete user type implementing `Authenticatable + Clone`
///
/// # Example
///
/// ```rust,ignore
/// #[handler]
/// pub async fn profile(user: AuthUser<User>) -> Response {
/// json_response!({ "id": user.id, "email": user.email })
/// }
/// ```
;
/// Extracts the authenticated user as `Option<T>`, never failing on auth.
///
/// Use this in handler signatures where authentication is optional.
/// Returns `None` for guests instead of a 401 error.
///
/// # Type Parameters
///
/// * `T` - The concrete user type implementing `Authenticatable + Clone`
///
/// # Example
///
/// ```rust,ignore
/// #[handler]
/// pub async fn home(user: OptionalUser<User>) -> Response {
/// if let Some(u) = user.as_ref() {
/// json_response!({ "message": format!("Welcome back, {}!", u.name) })
/// } else {
/// json_response!({ "message": "Welcome, guest!" })
/// }
/// }
/// ```
;