test/
test.rs

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}