1use afast::{AFast, AFastData, AFastKind, Error, handler, middleware, register};
2
3#[derive(Debug, Clone, AFastData, AFastKind)]
4enum Sex {
5 Other,
6 Custom(#[validate(desc("Custom user sex 0"))] i32, String),
7 Male {
8 #[validate(desc("Male user id"))]
9 id: i64,
10 },
11 Female {
12 #[validate(desc("Female user name"))]
13 name: String,
14 },
15}
16
17#[derive(Debug, Clone, AFastData, AFastKind)]
18struct Request {
19 #[validate(desc("User ID"))]
20 id: i64,
21 #[validate(desc("User name"))]
22 name: String,
23 #[validate(
24 desc("User age"),
25 required("age is required"),
26 min(1, "age must be at least 1"),
27 max(256, "age must be at most 256")
28 )]
29 age: u32,
30 #[validate(desc("User hobbies"))]
31 hobbies: Vec<Hobby>,
32 #[validate(desc("User tags"))]
33 tags: Vec<String>,
34 #[validate(desc("User gender"))]
35 gender: Option<bool>,
36 #[validate(desc("User sex"))]
37 sex: Sex,
38}
39
40#[derive(Debug, Clone, AFastData, AFastKind)]
41struct Hobby {
42 id: i64,
43 name: String,
44}
45
46#[derive(Debug, AFastData, AFastKind)]
47pub struct Response {
48 sex: Sex,
49 id: i64,
50 name: String,
51 age: u32,
52 hobbies: Vec<Hobby>,
53 tags: Vec<String>,
54 gender: Option<bool>,
55}
56
57#[handler(desc("Get user information"), ns("api.user"))]
58async fn get_user(_state: String, _header: Header, req: Request) -> Result<Response, Error> {
59 Ok(Response {
60 id: req.id,
61 name: req.name.clone(),
62 age: req.age,
63 hobbies: req.hobbies.clone(),
64 tags: req.tags.clone(),
65 gender: req.gender,
66 sex: req.sex.clone(),
67 })
68}
69
70#[derive(Debug, AFastData, AFastKind)]
71struct Req2 {
72 id: i64,
73}
74
75#[derive(Debug, AFastData, AFastKind)]
76struct Resp2 {
77 id: i64,
78 name: String,
79}
80
81#[handler(desc("Get user by id"), ns("api"))]
82async fn get_id(_state: String, _header: Header, req: Req2) -> Result<Resp2, Error> {
83 Ok(Resp2 {
84 id: req.id,
85 name: "John".to_string(),
86 })
87}
88
89#[derive(Debug, Clone, AFastData, AFastKind)]
90struct Header {
91 id: u32,
92}
93
94#[middleware]
95async fn auth(_state: String, header: Header) -> Result<Header, Error> {
96 println!("Token: {:?}", header);
97 Ok(header)
98}
99
100#[tokio::main]
101async fn main() {
102 let state = "".to_string();
103
104 let server = AFast::<String, Header>::new(state)
105 .service("user", "User service", register! { get_user, get_id })
106 .middleware(auth);
107
108 server
109 .serve(
110 #[cfg(feature = "tcp")]
111 &"127.0.0.1:8080",
112 #[cfg(any(feature = "http", feature = "ws"))]
113 &"127.0.0.1:8081",
114 )
115 .await
116 .unwrap();
117}