Skip to main content

salvo_oapi/extract/
parameter.rs

1//! Request parameter extractors for the API operation.
2
3pub use salvo_core::extract::{CookieParam, HeaderParam, PathParam, QueryParam};
4
5use crate::endpoint::EndpointArgRegister;
6use crate::{Components, Operation, Parameter, ParameterIn, ToSchema};
7
8impl<T, const REQUIRED: bool> EndpointArgRegister for CookieParam<T, REQUIRED>
9where
10    T: ToSchema,
11{
12    fn register(components: &mut Components, operation: &mut Operation, arg: &str) {
13        let parameter = Parameter::new(arg)
14            .location(ParameterIn::Cookie)
15            .description(format!("Get parameter `{arg}` from request cookie."))
16            .schema(T::to_schema(components))
17            .required(REQUIRED);
18        operation.parameters.insert(parameter);
19    }
20}
21
22impl<T, const REQUIRED: bool> EndpointArgRegister for HeaderParam<T, REQUIRED>
23where
24    T: ToSchema,
25{
26    fn register(components: &mut Components, operation: &mut Operation, arg: &str) {
27        let parameter = Parameter::new(arg)
28            .location(ParameterIn::Header)
29            .description(format!("Get parameter `{arg}` from request headers."))
30            .schema(T::to_schema(components))
31            .required(REQUIRED);
32        operation.parameters.insert(parameter);
33    }
34}
35
36impl<T> EndpointArgRegister for PathParam<T>
37where
38    T: ToSchema,
39{
40    fn register(components: &mut Components, operation: &mut Operation, arg: &str) {
41        let parameter = Parameter::new(arg)
42            .location(ParameterIn::Path)
43            .description(format!("Get parameter `{arg}` from request url path."))
44            .schema(T::to_schema(components))
45            .required(true);
46        operation.parameters.insert(parameter);
47    }
48}
49
50impl<T, const REQUIRED: bool> EndpointArgRegister for QueryParam<T, REQUIRED>
51where
52    T: ToSchema,
53{
54    fn register(components: &mut Components, operation: &mut Operation, arg: &str) {
55        let parameter = Parameter::new(arg)
56            .location(ParameterIn::Query)
57            .description(format!("Get parameter `{arg}` from request url query."))
58            .schema(T::to_schema(components))
59            .required(REQUIRED);
60        operation.parameters.insert(parameter);
61    }
62}
63
64#[cfg(test)]
65mod tests {
66    use assert_json_diff::assert_json_eq;
67    use serde_json::json;
68
69    use super::*;
70
71    #[test]
72    fn test_cookie_param_register() {
73        let mut components = Components::new();
74        let mut operation = Operation::new();
75        CookieParam::<String, false>::register(&mut components, &mut operation, "arg");
76
77        assert_json_eq!(
78            operation,
79            json!({
80                "parameters": [{
81                    "name": "arg",
82                    "in": "cookie",
83                    "description": "Get parameter `arg` from request cookie.",
84                    "required": false,
85                    "schema": { "type": "string" }
86                }],
87                "responses": {}
88            })
89        );
90    }
91
92    #[test]
93    fn test_header_param_register() {
94        let mut components = Components::new();
95        let mut operation = Operation::new();
96        HeaderParam::<String, false>::register(&mut components, &mut operation, "arg");
97
98        assert_json_eq!(
99            operation,
100            json!({
101                "parameters": [{
102                    "name": "arg",
103                    "in": "header",
104                    "description": "Get parameter `arg` from request headers.",
105                    "required": false,
106                    "schema": { "type": "string" }
107                }],
108                "responses": {}
109            })
110        );
111    }
112
113    #[test]
114    fn test_path_param_register() {
115        let mut components = Components::new();
116        let mut operation = Operation::new();
117        PathParam::<String>::register(&mut components, &mut operation, "arg");
118
119        assert_json_eq!(
120            operation,
121            json!({
122                "parameters": [{
123                    "name": "arg",
124                    "in": "path",
125                    "description": "Get parameter `arg` from request url path.",
126                    "required": true,
127                    "schema": { "type": "string" }
128                }],
129                "responses": {}
130            })
131        );
132    }
133
134    #[test]
135    fn test_query_param_register() {
136        let mut components = Components::new();
137        let mut operation = Operation::new();
138        QueryParam::<String, false>::register(&mut components, &mut operation, "arg");
139
140        assert_json_eq!(
141            operation,
142            json!({
143                "parameters": [{
144                    "name": "arg",
145                    "in": "query",
146                    "description": "Get parameter `arg` from request url query.",
147                    "required": false,
148                    "schema": { "type": "string" }
149                }],
150                "responses": {}
151            })
152        );
153    }
154}