Skip to main content

fakecloud_core/
query.rs

1//! Shared helpers for AWS Query protocol services (SQS, SNS, ElastiCache, RDS, SES v1, IAM).
2
3use http::StatusCode;
4
5use crate::service::{AwsRequest, AwsServiceError};
6
7/// Wrap an action result in the standard AWS Query protocol XML envelope.
8///
9/// Produces the canonical response shape:
10/// ```xml
11/// <?xml version="1.0" encoding="UTF-8"?>
12/// <{Action}Response xmlns="{namespace}">
13///   <{Action}Result>{inner}</{Action}Result>
14///   <ResponseMetadata><RequestId>{request_id}</RequestId></ResponseMetadata>
15/// </{Action}Response>
16/// ```
17pub fn query_response_xml(action: &str, namespace: &str, inner: &str, request_id: &str) -> String {
18    format!(
19        "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\
20         <{action}Response xmlns=\"{namespace}\">\
21         <{action}Result>{inner}</{action}Result>\
22         <ResponseMetadata><RequestId>{request_id}</RequestId></ResponseMetadata>\
23         </{action}Response>"
24    )
25}
26
27/// Produce a Query protocol XML response with only metadata (no result body).
28pub fn query_metadata_only_xml(action: &str, namespace: &str, request_id: &str) -> String {
29    format!(
30        "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\
31         <{action}Response xmlns=\"{namespace}\">\
32         <ResponseMetadata><RequestId>{request_id}</RequestId></ResponseMetadata>\
33         </{action}Response>"
34    )
35}
36
37/// Extract an optional query parameter from an `AwsRequest`.
38///
39/// Returns `None` if the parameter is missing or empty.
40pub fn optional_query_param(req: &AwsRequest, name: &str) -> Option<String> {
41    req.query_params
42        .get(name)
43        .cloned()
44        .filter(|value| !value.is_empty())
45}
46
47/// Extract a required query parameter from an `AwsRequest`.
48///
49/// Returns `MissingParameter` error if the parameter is missing or empty.
50pub fn required_query_param(req: &AwsRequest, name: &str) -> Result<String, AwsServiceError> {
51    optional_query_param(req, name).ok_or_else(|| {
52        AwsServiceError::aws_error(
53            StatusCode::BAD_REQUEST,
54            "MissingParameter",
55            format!("The request must contain the parameter {name}."),
56        )
57    })
58}