redfish_axum/
usb_controller_collection.rs

1// Generated by redfish-codegen. Do not modify.
2
3/// The default privileges required for accessing USBControllerCollection instances.
4pub struct DefaultPrivileges;
5impl redfish_core::privilege::OperationPrivilegeMapping for DefaultPrivileges {
6    type Get = redfish_core::privilege::Login;
7    type Head = redfish_core::privilege::Login;
8    type Post = redfish_core::privilege::ConfigureComponents;
9    type Put = redfish_core::privilege::ConfigureComponents;
10    type Patch = redfish_core::privilege::ConfigureComponents;
11    type Delete = redfish_core::privilege::ConfigureComponents;
12}
13
14/// This endpoint implements the USBControllerCollection component.
15///
16/// It can be mounted on the following components:
17/// * [ComputerSystem][crate::computer_system::ComputerSystem]
18pub struct USBControllerCollection<S, P>
19where
20    S: Clone,
21{
22    router: axum::routing::MethodRouter<S>,
23    privilege_marker: std::marker::PhantomData<fn() -> P>,
24    allowed_methods: Vec<axum::http::method::Method>,
25    members_router: axum::routing::MethodRouter<S>,
26    usb_controller: Option<axum::Router<S>>,
27}
28
29impl<S> Default for USBControllerCollection<S, DefaultPrivileges>
30where
31    S: Clone,
32{
33    fn default() -> Self {
34        Self {
35            router: Default::default(),
36            privilege_marker: Default::default(),
37            allowed_methods: Vec::new(),
38            members_router: Default::default(),
39            usb_controller: Default::default(),
40        }
41    }
42}
43
44impl<S, P> USBControllerCollection<S, P>
45where
46    S: AsRef<dyn redfish_core::auth::AuthenticateRequest> + Clone + Send + Sync + 'static,
47    P: redfish_core::privilege::OperationPrivilegeMapping + 'static,
48    <P as redfish_core::privilege::OperationPrivilegeMapping>::Get: Send,
49{
50    pub fn get<H, T>(mut self, handler: H) -> Self
51    where
52        H: axum::handler::Handler<T, S, axum::body::Body>,
53        T: 'static,
54    {
55        let operation = axum::routing::get(
56            |auth: redfish_core::extract::RedfishAuth<P::Get>,
57             axum::extract::State(state): axum::extract::State<S>,
58             mut request: axum::http::Request<axum::body::Body>| async {
59                request.extensions_mut().insert(auth.user);
60                handler.call(request, state).await
61            },
62        );
63        self.router = self.router.get(operation);
64        self.allowed_methods.push(axum::http::method::Method::GET);
65        self
66    }
67
68    /// Serves an instance of a [USBController][crate::usb_controller::USBController].
69    pub fn usb_controller(mut self, usb_controller: axum::Router<S>) -> Self {
70        self.usb_controller = Some(usb_controller);
71        self
72    }
73
74    pub fn into_router(self) -> axum::Router<S> {
75        let Self {
76            router,
77            mut allowed_methods,
78            members_router,
79            usb_controller,
80            ..
81        } = self;
82        let result = axum::Router::default();
83        let result = match usb_controller {
84            Some(router) => result.nest("/:usb_controller_id", router),
85            None => result,
86        };
87        let result = result.route(
88            "/Members",
89            members_router.fallback(|| async {
90                (
91                    axum::http::StatusCode::METHOD_NOT_ALLOWED,
92                    axum::Json(redfish_core::error::one_message(redfish_codegen::registries::base::v1_16_0::Base::OperationNotAllowed.into())),
93                )
94            })
95        );
96        allowed_methods.dedup();
97        let allow_header = allowed_methods
98            .into_iter()
99            .map(|method| method.to_string())
100            .reduce(|one, two| one + "," + &two)
101            .unwrap();
102        result.route(
103            "/",
104            router.fallback(|| async {
105                (
106                    axum::http::StatusCode::METHOD_NOT_ALLOWED,
107                    axum::Json(redfish_core::error::one_message(redfish_codegen::registries::base::v1_16_0::Base::OperationNotAllowed.into())),
108                )
109            })
110            .route_layer(axum::middleware::from_fn_with_state(
111                allow_header,
112                |axum::extract::State(allow_header): axum::extract::State<String>,
113                 request: axum::http::Request<axum::body::Body>,
114                 next: axum::middleware::Next<axum::body::Body>| async move {
115                    let apply_allow = matches!(*request.method(), axum::http::Method::GET | axum::http::Method::HEAD);
116                    let mut response = next.run(request).await;
117                    if apply_allow && !response.headers().contains_key(axum::http::header::ALLOW) {
118                        response.headers_mut().insert(
119                            axum::http::header::ALLOW,
120                            axum::http::HeaderValue::from_str(&allow_header).unwrap(),
121                        );
122                    }
123                    response
124                },
125            )),
126        )
127    }
128}