Skip to main content

fakecloud_sdk/
types.rs

1use serde::{Deserialize, Serialize};
2
3// ── Health ──────────────────────────────────────────────────────────
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
6#[serde(rename_all = "camelCase")]
7pub struct HealthResponse {
8    pub status: String,
9    pub version: String,
10    pub services: Vec<String>,
11}
12
13// ── Reset ───────────────────────────────────────────────────────────
14
15#[derive(Debug, Clone, Serialize, Deserialize)]
16#[serde(rename_all = "camelCase")]
17pub struct ResetResponse {
18    pub status: String,
19}
20
21#[derive(Debug, Clone, Serialize, Deserialize)]
22#[serde(rename_all = "camelCase")]
23pub struct ResetServiceResponse {
24    pub reset: String,
25}
26
27// ── RDS ─────────────────────────────────────────────────────────────
28
29#[derive(Debug, Clone, Serialize, Deserialize)]
30#[serde(rename_all = "camelCase")]
31pub struct RdsTag {
32    pub key: String,
33    pub value: String,
34}
35
36#[derive(Debug, Clone, Serialize, Deserialize)]
37#[serde(rename_all = "camelCase")]
38pub struct RdsInstance {
39    pub db_instance_identifier: String,
40    pub db_instance_arn: String,
41    pub db_instance_class: String,
42    pub engine: String,
43    pub engine_version: String,
44    pub db_instance_status: String,
45    pub master_username: String,
46    pub db_name: Option<String>,
47    pub endpoint_address: String,
48    pub port: i32,
49    pub allocated_storage: i32,
50    pub publicly_accessible: bool,
51    pub deletion_protection: bool,
52    pub created_at: String,
53    pub dbi_resource_id: String,
54    pub container_id: String,
55    pub host_port: u16,
56    pub tags: Vec<RdsTag>,
57}
58
59#[derive(Debug, Clone, Serialize, Deserialize)]
60#[serde(rename_all = "camelCase")]
61pub struct RdsInstancesResponse {
62    pub instances: Vec<RdsInstance>,
63}
64
65// ── Lambda ──────────────────────────────────────────────────────────
66
67#[derive(Debug, Clone, Serialize, Deserialize)]
68#[serde(rename_all = "camelCase")]
69pub struct LambdaInvocation {
70    pub function_arn: String,
71    pub payload: String,
72    pub source: String,
73    pub timestamp: String,
74}
75
76#[derive(Debug, Clone, Serialize, Deserialize)]
77#[serde(rename_all = "camelCase")]
78pub struct LambdaInvocationsResponse {
79    pub invocations: Vec<LambdaInvocation>,
80}
81
82#[derive(Debug, Clone, Serialize, Deserialize)]
83#[serde(rename_all = "camelCase")]
84pub struct WarmContainer {
85    pub function_name: String,
86    pub runtime: String,
87    pub container_id: String,
88    pub last_used_secs_ago: u64,
89}
90
91#[derive(Debug, Clone, Serialize, Deserialize)]
92#[serde(rename_all = "camelCase")]
93pub struct WarmContainersResponse {
94    pub containers: Vec<WarmContainer>,
95}
96
97#[derive(Debug, Clone, Serialize, Deserialize)]
98#[serde(rename_all = "camelCase")]
99pub struct EvictContainerResponse {
100    pub evicted: bool,
101}
102
103// ── SES ─────────────────────────────────────────────────────────────
104
105#[derive(Debug, Clone, Serialize, Deserialize)]
106#[serde(rename_all = "camelCase")]
107pub struct SentEmail {
108    pub message_id: String,
109    pub from: String,
110    pub to: Vec<String>,
111    #[serde(default)]
112    pub cc: Vec<String>,
113    #[serde(default)]
114    pub bcc: Vec<String>,
115    pub subject: Option<String>,
116    pub html_body: Option<String>,
117    pub text_body: Option<String>,
118    pub raw_data: Option<String>,
119    pub template_name: Option<String>,
120    pub template_data: Option<String>,
121    pub timestamp: String,
122}
123
124#[derive(Debug, Clone, Serialize, Deserialize)]
125#[serde(rename_all = "camelCase")]
126pub struct SesEmailsResponse {
127    pub emails: Vec<SentEmail>,
128}
129
130#[derive(Debug, Clone, Serialize, Deserialize)]
131#[serde(rename_all = "camelCase")]
132pub struct InboundEmailRequest {
133    pub from: String,
134    pub to: Vec<String>,
135    pub subject: String,
136    pub body: String,
137}
138
139#[derive(Debug, Clone, Serialize, Deserialize)]
140#[serde(rename_all = "camelCase")]
141pub struct InboundActionExecuted {
142    pub rule: String,
143    pub action_type: String,
144}
145
146#[derive(Debug, Clone, Serialize, Deserialize)]
147#[serde(rename_all = "camelCase")]
148pub struct InboundEmailResponse {
149    pub message_id: String,
150    pub matched_rules: Vec<String>,
151    pub actions_executed: Vec<InboundActionExecuted>,
152}
153
154// ── SNS ─────────────────────────────────────────────────────────────
155
156#[derive(Debug, Clone, Serialize, Deserialize)]
157#[serde(rename_all = "camelCase")]
158pub struct SnsMessage {
159    pub message_id: String,
160    pub topic_arn: String,
161    pub message: String,
162    pub subject: Option<String>,
163    pub timestamp: String,
164}
165
166#[derive(Debug, Clone, Serialize, Deserialize)]
167#[serde(rename_all = "camelCase")]
168pub struct SnsMessagesResponse {
169    pub messages: Vec<SnsMessage>,
170}
171
172#[derive(Debug, Clone, Serialize, Deserialize)]
173#[serde(rename_all = "camelCase")]
174pub struct SnsSmsMessage {
175    pub phone_number: String,
176    pub message: String,
177}
178
179#[derive(Debug, Clone, Serialize, Deserialize)]
180#[serde(rename_all = "camelCase")]
181pub struct SnsSmsResponse {
182    pub messages: Vec<SnsSmsMessage>,
183}
184
185#[derive(Debug, Clone, Serialize, Deserialize)]
186#[serde(rename_all = "camelCase")]
187pub struct PendingConfirmation {
188    pub subscription_arn: String,
189    pub topic_arn: String,
190    pub protocol: String,
191    pub endpoint: String,
192    pub token: Option<String>,
193}
194
195#[derive(Debug, Clone, Serialize, Deserialize)]
196#[serde(rename_all = "camelCase")]
197pub struct PendingConfirmationsResponse {
198    pub pending_confirmations: Vec<PendingConfirmation>,
199}
200
201#[derive(Debug, Clone, Serialize, Deserialize)]
202#[serde(rename_all = "camelCase")]
203pub struct ConfirmSubscriptionRequest {
204    pub subscription_arn: String,
205}
206
207#[derive(Debug, Clone, Serialize, Deserialize)]
208#[serde(rename_all = "camelCase")]
209pub struct ConfirmSubscriptionResponse {
210    pub confirmed: bool,
211}
212
213// ── SQS ─────────────────────────────────────────────────────────────
214
215#[derive(Debug, Clone, Serialize, Deserialize)]
216#[serde(rename_all = "camelCase")]
217pub struct SqsMessageInfo {
218    pub message_id: String,
219    pub body: String,
220    pub receive_count: u64,
221    pub in_flight: bool,
222    pub created_at: String,
223}
224
225#[derive(Debug, Clone, Serialize, Deserialize)]
226#[serde(rename_all = "camelCase")]
227pub struct SqsQueueMessages {
228    pub queue_url: String,
229    pub queue_name: String,
230    pub messages: Vec<SqsMessageInfo>,
231}
232
233#[derive(Debug, Clone, Serialize, Deserialize)]
234#[serde(rename_all = "camelCase")]
235pub struct SqsMessagesResponse {
236    pub queues: Vec<SqsQueueMessages>,
237}
238
239#[derive(Debug, Clone, Serialize, Deserialize)]
240#[serde(rename_all = "camelCase")]
241pub struct ExpirationTickResponse {
242    pub expired_messages: u64,
243}
244
245#[derive(Debug, Clone, Serialize, Deserialize)]
246#[serde(rename_all = "camelCase")]
247pub struct ForceDlqResponse {
248    pub moved_messages: u64,
249}
250
251// ── EventBridge ─────────────────────────────────────────────────────
252
253#[derive(Debug, Clone, Serialize, Deserialize)]
254#[serde(rename_all = "camelCase")]
255pub struct EventBridgeEvent {
256    pub event_id: String,
257    pub source: String,
258    pub detail_type: String,
259    pub detail: String,
260    pub bus_name: String,
261    pub timestamp: String,
262}
263
264#[derive(Debug, Clone, Serialize, Deserialize)]
265#[serde(rename_all = "camelCase")]
266pub struct EventBridgeLambdaDelivery {
267    pub function_arn: String,
268    pub payload: String,
269    pub timestamp: String,
270}
271
272#[derive(Debug, Clone, Serialize, Deserialize)]
273#[serde(rename_all = "camelCase")]
274pub struct EventBridgeLogDelivery {
275    pub log_group_arn: String,
276    pub payload: String,
277    pub timestamp: String,
278}
279
280#[derive(Debug, Clone, Serialize, Deserialize)]
281#[serde(rename_all = "camelCase")]
282pub struct EventBridgeDeliveries {
283    pub lambda: Vec<EventBridgeLambdaDelivery>,
284    pub logs: Vec<EventBridgeLogDelivery>,
285}
286
287#[derive(Debug, Clone, Serialize, Deserialize)]
288#[serde(rename_all = "camelCase")]
289pub struct EventHistoryResponse {
290    pub events: Vec<EventBridgeEvent>,
291    pub deliveries: EventBridgeDeliveries,
292}
293
294#[derive(Debug, Clone, Serialize, Deserialize)]
295#[serde(rename_all = "camelCase")]
296pub struct FireRuleRequest {
297    pub bus_name: Option<String>,
298    pub rule_name: String,
299}
300
301// ── RDS aws_lambda extension bridge ─────────────────────────────────
302
303/// Request body for `POST /_fakecloud/rds/lambda-invoke`. The endpoint is
304/// the bridge that the PostgreSQL `aws_lambda` extension calls into from
305/// inside an RDS DB instance container — it's normally not driven by
306/// user code directly.
307#[derive(Debug, Clone, Serialize, Deserialize)]
308#[serde(rename_all = "snake_case")]
309pub struct RdsLambdaInvokeRequest {
310    pub function_name: String,
311    pub payload: Option<serde_json::Value>,
312    pub invocation_type: Option<String>,
313    pub region: Option<String>,
314}
315
316/// Shape returned by the bridge — mirrors what `aws_lambda.invoke()`
317/// returns to SQL callers (RDS/Aurora-compatible).
318#[derive(Debug, Clone, Serialize, Deserialize)]
319#[serde(rename_all = "snake_case")]
320pub struct RdsLambdaInvokeResponse {
321    pub status_code: i32,
322    pub payload: Option<serde_json::Value>,
323    pub executed_version: Option<String>,
324    pub log_result: Option<String>,
325}
326
327#[derive(Debug, Clone, Serialize, Deserialize)]
328#[serde(rename_all = "camelCase")]
329pub struct FireRuleTarget {
330    #[serde(rename = "type")]
331    pub target_type: String,
332    pub arn: String,
333}
334
335#[derive(Debug, Clone, Serialize, Deserialize)]
336#[serde(rename_all = "camelCase")]
337pub struct FireRuleResponse {
338    pub targets: Vec<FireRuleTarget>,
339}
340
341// ── Scheduler (EventBridge Scheduler) ───────────────────────────────
342
343#[derive(Debug, Clone, Serialize, Deserialize)]
344#[serde(rename_all = "camelCase")]
345pub struct SchedulerSchedule {
346    pub account_id: String,
347    pub group_name: String,
348    pub name: String,
349    pub arn: String,
350    pub state: String,
351    pub schedule_expression: String,
352    pub target_arn: String,
353    pub last_fired: Option<String>,
354}
355
356#[derive(Debug, Clone, Serialize, Deserialize)]
357#[serde(rename_all = "camelCase")]
358pub struct SchedulerSchedulesResponse {
359    pub schedules: Vec<SchedulerSchedule>,
360}
361
362#[derive(Debug, Clone, Serialize, Deserialize)]
363#[serde(rename_all = "camelCase")]
364pub struct FireScheduleResponse {
365    pub schedule_arn: String,
366    pub target_arn: String,
367}
368
369// ── S3 ──────────────────────────────────────────────────────────────
370
371#[derive(Debug, Clone, Serialize, Deserialize)]
372#[serde(rename_all = "camelCase")]
373pub struct S3Notification {
374    pub bucket: String,
375    pub key: String,
376    pub event_type: String,
377    pub timestamp: String,
378}
379
380#[derive(Debug, Clone, Serialize, Deserialize)]
381#[serde(rename_all = "camelCase")]
382pub struct S3NotificationsResponse {
383    pub notifications: Vec<S3Notification>,
384}
385
386#[derive(Debug, Clone, Serialize, Deserialize)]
387#[serde(rename_all = "camelCase")]
388pub struct LifecycleTickResponse {
389    pub processed_buckets: u64,
390    pub expired_objects: u64,
391    pub transitioned_objects: u64,
392}
393
394// ── DynamoDB ────────────────────────────────────────────────────────
395
396#[derive(Debug, Clone, Serialize, Deserialize)]
397#[serde(rename_all = "camelCase")]
398pub struct TtlTickResponse {
399    pub expired_items: u64,
400}
401
402// ── SecretsManager ──────────────────────────────────────────────────
403
404#[derive(Debug, Clone, Serialize, Deserialize)]
405#[serde(rename_all = "camelCase")]
406pub struct RotationTickResponse {
407    pub rotated_secrets: Vec<String>,
408}
409
410// ── ElastiCache ─────────────────────────────────────────────────────
411
412#[derive(Debug, Clone, Serialize, Deserialize)]
413#[serde(rename_all = "camelCase")]
414pub struct ElastiCacheCluster {
415    pub cache_cluster_id: String,
416    pub cache_cluster_status: String,
417    pub engine: String,
418    pub engine_version: String,
419    pub cache_node_type: String,
420    pub num_cache_nodes: i32,
421    pub replication_group_id: Option<String>,
422    pub port: Option<i32>,
423    pub host_port: Option<u16>,
424    pub container_id: Option<String>,
425}
426
427#[derive(Debug, Clone, Serialize, Deserialize)]
428#[serde(rename_all = "camelCase")]
429pub struct ElastiCacheClustersResponse {
430    pub clusters: Vec<ElastiCacheCluster>,
431}
432
433#[derive(Debug, Clone, Serialize, Deserialize)]
434#[serde(rename_all = "camelCase")]
435pub struct ElastiCacheReplicationGroupIntrospection {
436    pub replication_group_id: String,
437    pub status: String,
438    pub description: String,
439    pub member_clusters: Vec<String>,
440    pub automatic_failover: bool,
441    pub multi_az: bool,
442    pub engine: String,
443    pub engine_version: String,
444    pub cache_node_type: String,
445    pub num_cache_clusters: i32,
446}
447
448#[derive(Debug, Clone, Serialize, Deserialize)]
449#[serde(rename_all = "camelCase")]
450pub struct ElastiCacheReplicationGroupsResponse {
451    pub replication_groups: Vec<ElastiCacheReplicationGroupIntrospection>,
452}
453
454#[derive(Debug, Clone, Serialize, Deserialize)]
455#[serde(rename_all = "camelCase")]
456pub struct ElastiCacheServerlessCacheIntrospection {
457    pub serverless_cache_name: String,
458    pub status: String,
459    pub engine: String,
460    pub engine_version: String,
461    pub cache_node_type: Option<String>,
462}
463
464#[derive(Debug, Clone, Serialize, Deserialize)]
465#[serde(rename_all = "camelCase")]
466pub struct ElastiCacheServerlessCachesResponse {
467    pub serverless_caches: Vec<ElastiCacheServerlessCacheIntrospection>,
468}
469
470// ── Step Functions ──────────────────────────────────────────────────
471
472#[derive(Debug, Clone, Serialize, Deserialize)]
473#[serde(rename_all = "camelCase")]
474pub struct StepFunctionsExecution {
475    pub execution_arn: String,
476    pub state_machine_arn: String,
477    pub name: String,
478    pub status: String,
479    #[serde(skip_serializing_if = "Option::is_none")]
480    pub input: Option<String>,
481    #[serde(skip_serializing_if = "Option::is_none")]
482    pub output: Option<String>,
483    pub start_date: String,
484    #[serde(skip_serializing_if = "Option::is_none")]
485    pub stop_date: Option<String>,
486}
487
488#[derive(Debug, Clone, Serialize, Deserialize)]
489#[serde(rename_all = "camelCase")]
490pub struct StepFunctionsExecutionsResponse {
491    pub executions: Vec<StepFunctionsExecution>,
492}
493
494#[derive(Debug, Clone, Serialize, Deserialize, Default)]
495#[serde(rename_all = "camelCase")]
496pub struct SfnEnqueueActivityTaskRequest {
497    pub activity_arn: String,
498    #[serde(skip_serializing_if = "Option::is_none")]
499    pub input: Option<String>,
500    #[serde(skip_serializing_if = "Option::is_none")]
501    pub heartbeat_seconds: Option<i64>,
502    #[serde(skip_serializing_if = "Option::is_none")]
503    pub timeout_seconds: Option<i64>,
504}
505
506#[derive(Debug, Clone, Serialize, Deserialize)]
507#[serde(rename_all = "camelCase")]
508pub struct SfnEnqueueActivityTaskResponse {
509    pub task_token: String,
510}
511
512// ── Cognito ─────────────────────────────────────────────────────────
513
514#[derive(Debug, Clone, Serialize, Deserialize)]
515#[serde(rename_all = "camelCase")]
516pub struct UserConfirmationCodes {
517    pub confirmation_code: Option<String>,
518    pub attribute_verification_codes: serde_json::Value,
519}
520
521#[derive(Debug, Clone, Serialize, Deserialize)]
522#[serde(rename_all = "camelCase")]
523pub struct ConfirmationCode {
524    pub pool_id: String,
525    pub username: String,
526    pub code: String,
527    #[serde(rename = "type")]
528    pub code_type: String,
529    #[serde(skip_serializing_if = "Option::is_none")]
530    pub attribute: Option<String>,
531}
532
533#[derive(Debug, Clone, Serialize, Deserialize)]
534#[serde(rename_all = "camelCase")]
535pub struct ConfirmationCodesResponse {
536    pub codes: Vec<ConfirmationCode>,
537}
538
539#[derive(Debug, Clone, Serialize, Deserialize)]
540#[serde(rename_all = "camelCase")]
541pub struct ConfirmUserRequest {
542    pub user_pool_id: String,
543    pub username: String,
544}
545
546#[derive(Debug, Clone, Serialize, Deserialize)]
547#[serde(rename_all = "camelCase")]
548pub struct ConfirmUserResponse {
549    pub confirmed: bool,
550    #[serde(skip_serializing_if = "Option::is_none")]
551    pub error: Option<String>,
552}
553
554#[derive(Debug, Clone, Serialize, Deserialize)]
555#[serde(rename_all = "camelCase")]
556pub struct TokenInfo {
557    #[serde(rename = "type")]
558    pub token_type: String,
559    pub username: String,
560    pub pool_id: String,
561    pub client_id: String,
562    pub issued_at: f64,
563}
564
565#[derive(Debug, Clone, Serialize, Deserialize)]
566#[serde(rename_all = "camelCase")]
567pub struct TokensResponse {
568    pub tokens: Vec<TokenInfo>,
569}
570
571#[derive(Debug, Clone, Serialize, Deserialize)]
572#[serde(rename_all = "camelCase")]
573pub struct ExpireTokensRequest {
574    #[serde(skip_serializing_if = "Option::is_none")]
575    pub user_pool_id: Option<String>,
576    #[serde(skip_serializing_if = "Option::is_none")]
577    pub username: Option<String>,
578}
579
580#[derive(Debug, Clone, Serialize, Deserialize)]
581#[serde(rename_all = "camelCase")]
582pub struct ExpireTokensResponse {
583    pub expired_tokens: u64,
584}
585
586#[derive(Debug, Clone, Serialize, Deserialize)]
587#[serde(rename_all = "camelCase")]
588pub struct AuthEvent {
589    pub event_type: String,
590    pub username: String,
591    pub user_pool_id: String,
592    pub client_id: Option<String>,
593    pub timestamp: f64,
594    pub success: bool,
595}
596
597#[derive(Debug, Clone, Serialize, Deserialize)]
598#[serde(rename_all = "camelCase")]
599pub struct AuthEventsResponse {
600    pub events: Vec<AuthEvent>,
601}
602
603// ── API Gateway v2 ──────────────────────────────────────────────────
604
605#[derive(Debug, Clone, Serialize, Deserialize)]
606#[serde(rename_all = "camelCase")]
607pub struct ApiGatewayV2Request {
608    pub request_id: String,
609    pub api_id: String,
610    pub stage: String,
611    pub method: String,
612    pub path: String,
613    pub headers: std::collections::HashMap<String, String>,
614    pub query_params: std::collections::HashMap<String, String>,
615    #[serde(skip_serializing_if = "Option::is_none")]
616    pub body: Option<String>,
617    pub timestamp: String,
618    pub status_code: u16,
619}
620
621#[derive(Debug, Clone, Serialize, Deserialize)]
622#[serde(rename_all = "camelCase")]
623pub struct ApiGatewayV2RequestsResponse {
624    pub requests: Vec<ApiGatewayV2Request>,
625}
626
627// ── Bedrock ────────────────────────────────────────────────────────
628
629#[derive(Debug, Clone, Serialize, Deserialize)]
630#[serde(rename_all = "camelCase")]
631pub struct BedrockInvocation {
632    pub model_id: String,
633    pub input: String,
634    pub output: String,
635    pub timestamp: String,
636    /// Error detail for faulted calls, or `None` on success.
637    #[serde(default)]
638    pub error: Option<String>,
639}
640
641#[derive(Debug, Clone, Serialize, Deserialize)]
642#[serde(rename_all = "camelCase")]
643pub struct BedrockInvocationsResponse {
644    pub invocations: Vec<BedrockInvocation>,
645}
646
647#[derive(Debug, Clone, Serialize, Deserialize)]
648#[serde(rename_all = "camelCase")]
649pub struct BedrockModelResponseConfig {
650    pub status: String,
651    pub model_id: String,
652}
653
654/// One rule in a per-model response rule list.
655///
656/// `prompt_contains` is a substring that must appear in the prompt for this
657/// rule to match. `None` or an empty string matches any prompt.
658#[derive(Debug, Clone, Serialize, Deserialize)]
659#[serde(rename_all = "camelCase")]
660pub struct BedrockResponseRule {
661    #[serde(default, skip_serializing_if = "Option::is_none")]
662    pub prompt_contains: Option<String>,
663    pub response: String,
664}
665
666/// Configuration for a fault to inject on Bedrock runtime calls.
667#[derive(Debug, Clone, Serialize, Deserialize, Default)]
668#[serde(rename_all = "camelCase")]
669pub struct BedrockFaultRule {
670    pub error_type: String,
671    #[serde(default, skip_serializing_if = "Option::is_none")]
672    pub message: Option<String>,
673    #[serde(default, skip_serializing_if = "Option::is_none")]
674    pub http_status: Option<u16>,
675    #[serde(default, skip_serializing_if = "Option::is_none")]
676    pub count: Option<u32>,
677    #[serde(default, skip_serializing_if = "Option::is_none")]
678    pub model_id: Option<String>,
679    #[serde(default, skip_serializing_if = "Option::is_none")]
680    pub operation: Option<String>,
681}
682
683/// Server-side view of a queued fault rule.
684#[derive(Debug, Clone, Serialize, Deserialize)]
685#[serde(rename_all = "camelCase")]
686pub struct BedrockFaultRuleState {
687    pub error_type: String,
688    pub message: String,
689    pub http_status: u16,
690    pub remaining: u32,
691    #[serde(default)]
692    pub model_id: Option<String>,
693    #[serde(default)]
694    pub operation: Option<String>,
695}
696
697#[derive(Debug, Clone, Serialize, Deserialize)]
698#[serde(rename_all = "camelCase")]
699pub struct BedrockFaultsResponse {
700    pub faults: Vec<BedrockFaultRuleState>,
701}
702
703#[derive(Debug, Clone, Serialize, Deserialize)]
704#[serde(rename_all = "camelCase")]
705pub struct BedrockStatusResponse {
706    pub status: String,
707}
708
709#[derive(Debug, Clone, Serialize, Deserialize)]
710#[serde(rename_all = "camelCase")]
711pub struct EcrRepository {
712    pub repository_name: String,
713    pub repository_arn: String,
714    pub registry_id: String,
715    pub repository_uri: String,
716    pub image_tag_mutability: String,
717    pub scan_on_push: bool,
718    pub created_at: String,
719    pub tags: Vec<EcrTag>,
720    pub has_policy: bool,
721    pub has_lifecycle_policy: bool,
722    pub image_count: u64,
723    pub layer_count: u64,
724}
725
726#[derive(Debug, Clone, Serialize, Deserialize)]
727#[serde(rename_all = "camelCase")]
728pub struct EcrImage {
729    pub repository_name: String,
730    pub image_digest: String,
731    pub image_tags: Vec<String>,
732    pub image_size_in_bytes: u64,
733    pub image_manifest_media_type: String,
734    pub image_pushed_at: String,
735}
736
737#[derive(Debug, Clone, Serialize, Deserialize)]
738#[serde(rename_all = "camelCase")]
739pub struct EcrImagesResponse {
740    pub images: Vec<EcrImage>,
741}
742
743#[derive(Debug, Clone, Serialize, Deserialize)]
744#[serde(rename_all = "camelCase")]
745pub struct EcrPullThroughRule {
746    pub ecr_repository_prefix: String,
747    pub upstream_registry_url: String,
748    pub upstream_registry: Option<String>,
749    pub credential_arn: Option<String>,
750    pub custom_role_arn: Option<String>,
751    pub created_at: String,
752    pub updated_at: String,
753}
754
755#[derive(Debug, Clone, Serialize, Deserialize)]
756#[serde(rename_all = "camelCase")]
757pub struct EcrPullThroughRulesResponse {
758    pub rules: Vec<EcrPullThroughRule>,
759}
760
761#[derive(Debug, Clone, Serialize, Deserialize)]
762#[serde(rename_all = "camelCase")]
763pub struct EcrTag {
764    pub key: String,
765    pub value: String,
766}
767
768#[derive(Debug, Clone, Serialize, Deserialize)]
769#[serde(rename_all = "camelCase")]
770pub struct EcrRepositoriesResponse {
771    pub repositories: Vec<EcrRepository>,
772}
773
774#[derive(Debug, Clone, Serialize, Deserialize)]
775#[serde(rename_all = "camelCase")]
776pub struct EcsCluster {
777    pub cluster_name: String,
778    pub cluster_arn: String,
779    pub status: String,
780    pub running_tasks_count: i32,
781    pub pending_tasks_count: i32,
782    pub active_services_count: i32,
783    pub registered_container_instances_count: i32,
784    pub capacity_providers: Vec<String>,
785    pub tags: Vec<EcsTag>,
786    pub created_at: String,
787}
788
789#[derive(Debug, Clone, Serialize, Deserialize)]
790#[serde(rename_all = "camelCase")]
791pub struct EcsTag {
792    pub key: String,
793    pub value: String,
794}
795
796#[derive(Debug, Clone, Serialize, Deserialize)]
797#[serde(rename_all = "camelCase")]
798pub struct EcsClustersResponse {
799    pub clusters: Vec<EcsCluster>,
800}
801
802#[derive(Debug, Clone, Serialize, Deserialize)]
803#[serde(rename_all = "camelCase")]
804pub struct EcsTaskContainer {
805    pub name: String,
806    pub image: String,
807    pub last_status: String,
808    pub exit_code: Option<i64>,
809    pub runtime_id: Option<String>,
810    pub essential: bool,
811}
812
813#[derive(Debug, Clone, Serialize, Deserialize)]
814#[serde(rename_all = "camelCase")]
815pub struct EcsTask {
816    pub task_arn: String,
817    pub task_id: String,
818    pub cluster_arn: String,
819    pub cluster_name: String,
820    pub task_definition_arn: String,
821    pub family: String,
822    pub revision: i32,
823    pub last_status: String,
824    pub desired_status: String,
825    pub launch_type: String,
826    pub created_at: String,
827    pub started_at: Option<String>,
828    pub stopping_at: Option<String>,
829    pub stopped_at: Option<String>,
830    pub stop_code: Option<String>,
831    pub stopped_reason: Option<String>,
832    pub containers: Vec<EcsTaskContainer>,
833    pub captured_log_bytes: usize,
834}
835
836#[derive(Debug, Clone, Serialize, Deserialize)]
837#[serde(rename_all = "camelCase")]
838pub struct EcsTasksResponse {
839    pub tasks: Vec<EcsTask>,
840}
841
842#[derive(Debug, Clone, Serialize, Deserialize)]
843#[serde(rename_all = "camelCase")]
844pub struct EcsTaskLogsResponse {
845    pub task_arn: String,
846    pub logs: String,
847    pub last_status: String,
848    pub exit_code: Option<i64>,
849}
850
851#[derive(Debug, Clone, Serialize, Deserialize, Default)]
852#[serde(rename_all = "camelCase")]
853pub struct EcsMarkFailedRequest {
854    pub exit_code: Option<i64>,
855    pub reason: Option<String>,
856}
857
858#[derive(Debug, Clone, Serialize, Deserialize)]
859#[serde(rename_all = "camelCase")]
860pub struct EcsLifecycleEvent {
861    pub at: String,
862    pub event_type: String,
863    pub task_arn: Option<String>,
864    pub cluster_arn: Option<String>,
865    pub last_status: Option<String>,
866    pub detail: serde_json::Value,
867}
868
869#[derive(Debug, Clone, Serialize, Deserialize)]
870#[serde(rename_all = "camelCase")]
871pub struct EcsEventsResponse {
872    pub events: Vec<EcsLifecycleEvent>,
873}
874
875// ── ELBv2 ───────────────────────────────────────────────────────────
876
877#[derive(Debug, Clone, Serialize, Deserialize)]
878#[serde(rename_all = "camelCase")]
879pub struct Elbv2LoadBalancer {
880    pub arn: String,
881    pub name: String,
882    pub dns_name: String,
883    pub scheme: String,
884    pub vpc_id: String,
885    pub state_code: String,
886    pub state_reason: Option<String>,
887    pub lb_type: String,
888    pub ip_address_type: String,
889    pub availability_zones: Vec<Elbv2AvailabilityZone>,
890    pub security_groups: Vec<String>,
891    pub created_time: String,
892    pub tags: Vec<Elbv2Tag>,
893    /// In-process data plane TCP port for ALBs. `None` for NLB/GWLB
894    /// or when the data plane is disabled. Tests connect to
895    /// `127.0.0.1:<bound_port>` to reach the routed targets.
896    #[serde(skip_serializing_if = "Option::is_none")]
897    pub bound_port: Option<u16>,
898}
899
900#[derive(Debug, Clone, Serialize, Deserialize)]
901#[serde(rename_all = "camelCase")]
902pub struct Elbv2AvailabilityZone {
903    pub zone_name: String,
904    pub subnet_id: String,
905}
906
907#[derive(Debug, Clone, Serialize, Deserialize)]
908#[serde(rename_all = "camelCase")]
909pub struct Elbv2Tag {
910    pub key: String,
911    pub value: String,
912}
913
914#[derive(Debug, Clone, Serialize, Deserialize)]
915#[serde(rename_all = "camelCase")]
916pub struct Elbv2LoadBalancersResponse {
917    pub load_balancers: Vec<Elbv2LoadBalancer>,
918}
919
920#[derive(Debug, Clone, Serialize, Deserialize)]
921#[serde(rename_all = "camelCase")]
922pub struct Elbv2TargetGroup {
923    pub arn: String,
924    pub name: String,
925    pub protocol: Option<String>,
926    pub port: Option<i32>,
927    pub vpc_id: Option<String>,
928    pub target_type: String,
929    pub load_balancer_arns: Vec<String>,
930    pub targets: Vec<Elbv2Target>,
931    pub health_check_protocol: Option<String>,
932    pub health_check_port: Option<String>,
933    pub health_check_path: Option<String>,
934    pub healthy_threshold_count: i32,
935    pub unhealthy_threshold_count: i32,
936    pub created_time: String,
937    pub tags: Vec<Elbv2Tag>,
938}
939
940#[derive(Debug, Clone, Serialize, Deserialize)]
941#[serde(rename_all = "camelCase")]
942pub struct Elbv2Target {
943    pub id: String,
944    pub port: Option<i32>,
945    pub availability_zone: Option<String>,
946    pub health_state: String,
947    pub health_reason: Option<String>,
948    pub health_description: Option<String>,
949}
950
951#[derive(Debug, Clone, Serialize, Deserialize)]
952#[serde(rename_all = "camelCase")]
953pub struct Elbv2TargetGroupsResponse {
954    pub target_groups: Vec<Elbv2TargetGroup>,
955}
956
957#[derive(Debug, Clone, Serialize, Deserialize)]
958#[serde(rename_all = "camelCase")]
959pub struct Elbv2Listener {
960    pub arn: String,
961    pub load_balancer_arn: String,
962    pub port: Option<i32>,
963    pub protocol: Option<String>,
964    pub ssl_policy: Option<String>,
965    pub certificate_arns: Vec<String>,
966    pub default_action_type: Option<String>,
967    pub default_target_group_arn: Option<String>,
968}
969
970#[derive(Debug, Clone, Serialize, Deserialize)]
971#[serde(rename_all = "camelCase")]
972pub struct Elbv2ListenersResponse {
973    pub listeners: Vec<Elbv2Listener>,
974}
975
976#[derive(Debug, Clone, Serialize, Deserialize)]
977#[serde(rename_all = "camelCase")]
978pub struct Elbv2Rule {
979    pub arn: String,
980    pub listener_arn: String,
981    pub priority: String,
982    pub is_default: bool,
983    pub condition_fields: Vec<String>,
984    pub action_type: Option<String>,
985}
986
987#[derive(Debug, Clone, Serialize, Deserialize)]
988#[serde(rename_all = "camelCase")]
989pub struct Elbv2RulesResponse {
990    pub rules: Vec<Elbv2Rule>,
991}
992
993/// Request to bootstrap an IAM admin user in a specific account.
994/// Used by `/_fakecloud/iam/create-admin` to solve the multi-account
995/// bootstrap problem: there's no per-account root credential, so this
996/// endpoint creates a user with full admin access in any account.
997#[derive(Debug, Clone, Serialize, Deserialize)]
998#[serde(rename_all = "camelCase")]
999pub struct CreateAdminRequest {
1000    pub account_id: String,
1001    pub user_name: String,
1002}
1003
1004#[derive(Debug, Clone, Serialize, Deserialize)]
1005#[serde(rename_all = "camelCase")]
1006pub struct CreateAdminResponse {
1007    pub access_key_id: String,
1008    pub secret_access_key: String,
1009    pub account_id: String,
1010    pub arn: String,
1011}