cratestack_axum/transport/
validate.rs1use axum::http::HeaderMap;
2use cratestack_core::{CoolError, RouteTransportCapabilities};
3use serde::Deserialize;
4
5use super::http_transport::HttpTransport;
6use super::media_type::{
7 request_content_type, validate_transport_accept_header, validate_transport_content_type_header,
8};
9
10pub fn validate_transport_request_headers<T>(
11 transport: &T,
12 headers: &HeaderMap,
13) -> Result<(), CoolError>
14where
15 T: HttpTransport,
16{
17 validate_transport_request_headers_for(
18 transport,
19 headers,
20 &RouteTransportCapabilities {
21 request_types: &[],
22 response_types: &[],
23 default_response_type: "",
24 supports_sequence_response: false,
25 },
26 )
27}
28
29pub fn validate_transport_response_headers<T>(
30 transport: &T,
31 headers: &HeaderMap,
32) -> Result<(), CoolError>
33where
34 T: HttpTransport,
35{
36 validate_transport_response_headers_for(
37 transport,
38 headers,
39 &RouteTransportCapabilities {
40 request_types: &[],
41 response_types: &[],
42 default_response_type: "",
43 supports_sequence_response: false,
44 },
45 )
46}
47
48pub fn validate_transport_request_headers_for<T>(
49 _transport: &T,
50 headers: &HeaderMap,
51 capabilities: &RouteTransportCapabilities,
52) -> Result<(), CoolError>
53where
54 T: HttpTransport,
55{
56 validate_transport_accept_header(headers, capabilities.response_types)?;
57 if capabilities.request_types.is_empty() {
58 Ok(())
59 } else {
60 validate_transport_content_type_header(headers, capabilities.request_types)
61 }
62}
63
64pub fn validate_transport_response_headers_for<T>(
65 _transport: &T,
66 headers: &HeaderMap,
67 capabilities: &RouteTransportCapabilities,
68) -> Result<(), CoolError>
69where
70 T: HttpTransport,
71{
72 validate_transport_accept_header(headers, capabilities.response_types)
73}
74
75pub fn decode_transport_request_for<TTransport, TValue>(
76 transport: &TTransport,
77 headers: &HeaderMap,
78 capabilities: &RouteTransportCapabilities,
79 body: &[u8],
80) -> Result<TValue, CoolError>
81where
82 TTransport: HttpTransport,
83 TValue: for<'de> Deserialize<'de>,
84{
85 let content_type = request_content_type(headers, capabilities.request_types)?;
86 transport.decode_request(content_type, body)
87}