Skip to main content

lenso_capability_http_endpoint/
lib.rs

1//! Generated bindings for backend-owned HTTP Endpoint providers.
2
3mod authoring;
4mod extract;
5pub mod response;
6pub mod testing;
7
8#[allow(unknown_lints)]
9#[allow(
10    clippy::chunks_exact_to_as_chunks,
11    clippy::manual_div_ceil,
12    clippy::manual_is_multiple_of,
13    clippy::verbose_bit_mask
14)]
15mod generated {
16    include!("generated.rs");
17}
18
19pub use authoring::{EndpointFuture, EndpointRoute, HttpEndpoint, MiddlewareOutcome};
20/// Deprecated compatibility name for [`QueryParams`].
21#[deprecated(
22    since = "0.3.0",
23    note = "use QueryParams to distinguish URL parameters from the QUERY HTTP method"
24)]
25pub use extract::QueryParams as Query;
26pub use extract::{
27    ExtractorFuture, ExtractorRejection, FromRequest, Json, Path, QueryParams, RequestId,
28};
29pub use generated::*;
30pub use lenso_capability_http_endpoint_macros::{endpoint, openapi_operation};
31
32/// Common imports for HTTP Endpoint Plugin authors.
33pub mod prelude {
34    pub use crate as http_endpoint_contract;
35    pub use crate::{
36        EndpointHandleInvocationError, HandleRequest, HandleResponse, Json, MiddlewareOutcome,
37        Path, QueryParams, RequestId, endpoint,
38        response::{IntoResponse, Problem, StatusCode},
39    };
40}
41
42#[doc(hidden)]
43pub use authoring::{__private, validate_endpoint_routes};
44
45#[cfg(test)]
46mod tests {
47    use super::*;
48
49    #[test]
50    fn endpoint_contract_round_trips_routes_credentials_parameters_and_bytes() {
51        let description = DescribeResponse {
52            routes: vec![DescribeResponseRoutesItem {
53                method: "GET".to_owned(),
54                openapi: Some(std::collections::BTreeMap::from([(
55                    "summary".to_owned(),
56                    serde_json::json!("Read an order"),
57                )])),
58                path: "/orders/{order_id}".to_owned(),
59                route_id: "orders.read".to_owned(),
60            }],
61        };
62        let wire = encode_describe_response(&description).unwrap();
63        assert_eq!(decode_describe_response(&wire).unwrap(), description);
64
65        let request = HandleRequest {
66            body: Bytes::from(vec![0, 1, 2]),
67            credential: Some(HandleRequestCredential {
68                scheme: "bearer".to_owned(),
69                value: "token".to_owned(),
70            }),
71            headers: vec![HandleRequestHeadersItem {
72                name: "accept".to_owned(),
73                value: "application/json".to_owned(),
74            }],
75            method: "GET".to_owned(),
76            path: "/orders/42".to_owned(),
77            path_parameters: vec![HandleRequestPathParametersItem {
78                name: "order_id".to_owned(),
79                value: "42".to_owned(),
80            }],
81            query: Some("include=items".to_owned()),
82            request_id: "request-1".to_owned(),
83            route_id: "orders.read".to_owned(),
84        };
85        let wire = encode_handle_request(&request).unwrap();
86        assert!(wire.contains(r#""body":"AAEC""#));
87        assert_eq!(decode_handle_request(&wire).unwrap(), request);
88    }
89
90    #[test]
91    fn endpoint_contract_values_support_cross_lane_transfer() {
92        fn assert_send<T: Send>() {}
93
94        const { assert!(CROSS_LANE_TRANSFER) };
95        assert_send::<DescribeRequest>();
96        assert_send::<DescribeResponse>();
97        assert_send::<DescribeError>();
98        assert_send::<HandleRequest>();
99        assert_send::<HandleResponse>();
100        assert_send::<HandleError>();
101    }
102}