prepared_request/
prepared_request.rs1use cloud_sdk::operation::{
4 ContentTypePolicy, CostIntent, OperationImpact, OperationMetadata, PreparationStorage,
5 PrepareOperation, PreparedRequest, ProviderService, RequestIdPolicy, RequestSemantics,
6 ResponseBodyPolicy, ResponsePolicy, RetryEligibility,
7};
8use cloud_sdk::transport::{
9 EndpointIdentity, EndpointPolicy, EndpointScheme, MediaType, RequestTarget, StatusCode,
10};
11use cloud_sdk::transport::{MAX_REQUEST_TARGET_BYTES, TransportRequest};
12use cloud_sdk::{
13 Method, ProviderId, ProviderMarker, ServiceId, ServiceMarker, provider_id, service_id,
14};
15
16static OK_STATUS: [StatusCode; 1] = [StatusCode::OK];
17static JSON_MEDIA: [MediaType<'static>; 1] = [MediaType::JSON];
18
19enum ExampleProvider {}
20
21impl ProviderMarker for ExampleProvider {
22 const ID: ProviderId = provider_id!("example");
23}
24
25enum ComputeService {}
26
27impl ServiceMarker for ComputeService {
28 type Provider = ExampleProvider;
29 const ID: ServiceId = service_id!("compute");
30}
31
32#[derive(Clone, Copy, Debug, Eq, PartialEq)]
33enum PrepareError {
34 TargetBuffer,
35 InvalidTarget,
36 InvalidMetadata,
37 InvalidResponsePolicy,
38 InvalidEndpoint,
39}
40
41struct ListResources;
42
43impl PrepareOperation for ListResources {
44 type Error = PrepareError;
45
46 fn prepare<'storage>(
47 &self,
48 storage: PreparationStorage<'storage>,
49 ) -> Result<PreparedRequest<'storage>, Self::Error> {
50 let (target_storage, _body_storage) = storage.into_parts();
51 let target = target_storage
52 .get_mut(..17)
53 .ok_or(PrepareError::TargetBuffer)?;
54 target.copy_from_slice(b"/resources?page=1");
55 let target = core::str::from_utf8(target).map_err(|_| PrepareError::InvalidTarget)?;
56 let target = RequestTarget::new(target).map_err(|_| PrepareError::InvalidTarget)?;
57 let request = TransportRequest::new(Method::Get, target);
58 let metadata = OperationMetadata::new(
59 OperationImpact::ReadOnly,
60 RequestSemantics::Safe,
61 RetryEligibility::ExplicitPolicy,
62 CostIntent::NoKnownCost,
63 RequestIdPolicy::Protected,
64 )
65 .map_err(|_| PrepareError::InvalidMetadata)?;
66 let response_policy = ResponsePolicy::new(
67 &OK_STATUS,
68 ContentTypePolicy::Required(&JSON_MEDIA),
69 ResponseBodyPolicy::Required,
70 65_536,
71 )
72 .map_err(|_| PrepareError::InvalidResponsePolicy)?;
73 let endpoint =
74 EndpointIdentity::new(EndpointScheme::Https, "api.example.invalid", 443, "/v1")
75 .map_err(|_| PrepareError::InvalidEndpoint)?;
76 Ok(PreparedRequest::new(
77 request,
78 ProviderService::from_marker::<ComputeService>(EndpointPolicy::fixed(endpoint)),
79 metadata,
80 response_policy,
81 ))
82 }
83}
84
85fn main() {
86 let mut target = [0_u8; MAX_REQUEST_TARGET_BYTES];
87 let mut body = [0_u8; 1];
88 let prepared = ListResources.prepare(PreparationStorage::new(&mut target, &mut body));
89 let Ok(prepared) = prepared else { return };
90
91 assert_eq!(prepared.transport_request().method(), Method::Get);
92 assert_eq!(prepared.metadata().impact(), OperationImpact::ReadOnly);
93 assert_eq!(prepared.response_policy().max_body_bytes(), 65_536);
94}