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#[derive(Debug, Clone, Serialize, Deserialize)]
302#[serde(rename_all = "camelCase")]
303pub struct FireRuleTarget {
304    #[serde(rename = "type")]
305    pub target_type: String,
306    pub arn: String,
307}
308
309#[derive(Debug, Clone, Serialize, Deserialize)]
310#[serde(rename_all = "camelCase")]
311pub struct FireRuleResponse {
312    pub targets: Vec<FireRuleTarget>,
313}
314
315// ── Scheduler (EventBridge Scheduler) ───────────────────────────────
316
317#[derive(Debug, Clone, Serialize, Deserialize)]
318#[serde(rename_all = "camelCase")]
319pub struct SchedulerSchedule {
320    pub account_id: String,
321    pub group_name: String,
322    pub name: String,
323    pub arn: String,
324    pub state: String,
325    pub schedule_expression: String,
326    pub target_arn: String,
327    pub last_fired: Option<String>,
328}
329
330#[derive(Debug, Clone, Serialize, Deserialize)]
331#[serde(rename_all = "camelCase")]
332pub struct SchedulerSchedulesResponse {
333    pub schedules: Vec<SchedulerSchedule>,
334}
335
336#[derive(Debug, Clone, Serialize, Deserialize)]
337#[serde(rename_all = "camelCase")]
338pub struct FireScheduleResponse {
339    pub schedule_arn: String,
340    pub target_arn: String,
341}
342
343// ── S3 ──────────────────────────────────────────────────────────────
344
345#[derive(Debug, Clone, Serialize, Deserialize)]
346#[serde(rename_all = "camelCase")]
347pub struct S3Notification {
348    pub bucket: String,
349    pub key: String,
350    pub event_type: String,
351    pub timestamp: String,
352}
353
354#[derive(Debug, Clone, Serialize, Deserialize)]
355#[serde(rename_all = "camelCase")]
356pub struct S3NotificationsResponse {
357    pub notifications: Vec<S3Notification>,
358}
359
360#[derive(Debug, Clone, Serialize, Deserialize)]
361#[serde(rename_all = "camelCase")]
362pub struct LifecycleTickResponse {
363    pub processed_buckets: u64,
364    pub expired_objects: u64,
365    pub transitioned_objects: u64,
366}
367
368// ── DynamoDB ────────────────────────────────────────────────────────
369
370#[derive(Debug, Clone, Serialize, Deserialize)]
371#[serde(rename_all = "camelCase")]
372pub struct TtlTickResponse {
373    pub expired_items: u64,
374}
375
376// ── SecretsManager ──────────────────────────────────────────────────
377
378#[derive(Debug, Clone, Serialize, Deserialize)]
379#[serde(rename_all = "camelCase")]
380pub struct RotationTickResponse {
381    pub rotated_secrets: Vec<String>,
382}
383
384// ── ElastiCache ─────────────────────────────────────────────────────
385
386#[derive(Debug, Clone, Serialize, Deserialize)]
387#[serde(rename_all = "camelCase")]
388pub struct ElastiCacheCluster {
389    pub cache_cluster_id: String,
390    pub cache_cluster_status: String,
391    pub engine: String,
392    pub engine_version: String,
393    pub cache_node_type: String,
394    pub num_cache_nodes: i32,
395    pub replication_group_id: Option<String>,
396    pub port: Option<i32>,
397    pub host_port: Option<u16>,
398    pub container_id: Option<String>,
399}
400
401#[derive(Debug, Clone, Serialize, Deserialize)]
402#[serde(rename_all = "camelCase")]
403pub struct ElastiCacheClustersResponse {
404    pub clusters: Vec<ElastiCacheCluster>,
405}
406
407#[derive(Debug, Clone, Serialize, Deserialize)]
408#[serde(rename_all = "camelCase")]
409pub struct ElastiCacheReplicationGroupIntrospection {
410    pub replication_group_id: String,
411    pub status: String,
412    pub description: String,
413    pub member_clusters: Vec<String>,
414    pub automatic_failover: bool,
415    pub multi_az: bool,
416    pub engine: String,
417    pub engine_version: String,
418    pub cache_node_type: String,
419    pub num_cache_clusters: i32,
420}
421
422#[derive(Debug, Clone, Serialize, Deserialize)]
423#[serde(rename_all = "camelCase")]
424pub struct ElastiCacheReplicationGroupsResponse {
425    pub replication_groups: Vec<ElastiCacheReplicationGroupIntrospection>,
426}
427
428#[derive(Debug, Clone, Serialize, Deserialize)]
429#[serde(rename_all = "camelCase")]
430pub struct ElastiCacheServerlessCacheIntrospection {
431    pub serverless_cache_name: String,
432    pub status: String,
433    pub engine: String,
434    pub engine_version: String,
435    pub cache_node_type: Option<String>,
436}
437
438#[derive(Debug, Clone, Serialize, Deserialize)]
439#[serde(rename_all = "camelCase")]
440pub struct ElastiCacheServerlessCachesResponse {
441    pub serverless_caches: Vec<ElastiCacheServerlessCacheIntrospection>,
442}
443
444// ── Step Functions ──────────────────────────────────────────────────
445
446#[derive(Debug, Clone, Serialize, Deserialize)]
447#[serde(rename_all = "camelCase")]
448pub struct StepFunctionsExecution {
449    pub execution_arn: String,
450    pub state_machine_arn: String,
451    pub name: String,
452    pub status: String,
453    #[serde(skip_serializing_if = "Option::is_none")]
454    pub input: Option<String>,
455    #[serde(skip_serializing_if = "Option::is_none")]
456    pub output: Option<String>,
457    pub start_date: String,
458    #[serde(skip_serializing_if = "Option::is_none")]
459    pub stop_date: Option<String>,
460}
461
462#[derive(Debug, Clone, Serialize, Deserialize)]
463#[serde(rename_all = "camelCase")]
464pub struct StepFunctionsExecutionsResponse {
465    pub executions: Vec<StepFunctionsExecution>,
466}
467
468#[derive(Debug, Clone, Serialize, Deserialize, Default)]
469#[serde(rename_all = "camelCase")]
470pub struct SfnEnqueueActivityTaskRequest {
471    pub activity_arn: String,
472    #[serde(skip_serializing_if = "Option::is_none")]
473    pub input: Option<String>,
474    #[serde(skip_serializing_if = "Option::is_none")]
475    pub heartbeat_seconds: Option<i64>,
476    #[serde(skip_serializing_if = "Option::is_none")]
477    pub timeout_seconds: Option<i64>,
478}
479
480#[derive(Debug, Clone, Serialize, Deserialize)]
481#[serde(rename_all = "camelCase")]
482pub struct SfnEnqueueActivityTaskResponse {
483    pub task_token: String,
484}
485
486// ── Cognito ─────────────────────────────────────────────────────────
487
488#[derive(Debug, Clone, Serialize, Deserialize)]
489#[serde(rename_all = "camelCase")]
490pub struct UserConfirmationCodes {
491    pub confirmation_code: Option<String>,
492    pub attribute_verification_codes: serde_json::Value,
493}
494
495#[derive(Debug, Clone, Serialize, Deserialize)]
496#[serde(rename_all = "camelCase")]
497pub struct ConfirmationCode {
498    pub pool_id: String,
499    pub username: String,
500    pub code: String,
501    #[serde(rename = "type")]
502    pub code_type: String,
503    #[serde(skip_serializing_if = "Option::is_none")]
504    pub attribute: Option<String>,
505}
506
507#[derive(Debug, Clone, Serialize, Deserialize)]
508#[serde(rename_all = "camelCase")]
509pub struct ConfirmationCodesResponse {
510    pub codes: Vec<ConfirmationCode>,
511}
512
513#[derive(Debug, Clone, Serialize, Deserialize)]
514#[serde(rename_all = "camelCase")]
515pub struct ConfirmUserRequest {
516    pub user_pool_id: String,
517    pub username: String,
518}
519
520#[derive(Debug, Clone, Serialize, Deserialize)]
521#[serde(rename_all = "camelCase")]
522pub struct ConfirmUserResponse {
523    pub confirmed: bool,
524    #[serde(skip_serializing_if = "Option::is_none")]
525    pub error: Option<String>,
526}
527
528#[derive(Debug, Clone, Serialize, Deserialize)]
529#[serde(rename_all = "camelCase")]
530pub struct TokenInfo {
531    #[serde(rename = "type")]
532    pub token_type: String,
533    pub username: String,
534    pub pool_id: String,
535    pub client_id: String,
536    pub issued_at: f64,
537}
538
539#[derive(Debug, Clone, Serialize, Deserialize)]
540#[serde(rename_all = "camelCase")]
541pub struct TokensResponse {
542    pub tokens: Vec<TokenInfo>,
543}
544
545#[derive(Debug, Clone, Serialize, Deserialize)]
546#[serde(rename_all = "camelCase")]
547pub struct ExpireTokensRequest {
548    #[serde(skip_serializing_if = "Option::is_none")]
549    pub user_pool_id: Option<String>,
550    #[serde(skip_serializing_if = "Option::is_none")]
551    pub username: Option<String>,
552}
553
554#[derive(Debug, Clone, Serialize, Deserialize)]
555#[serde(rename_all = "camelCase")]
556pub struct ExpireTokensResponse {
557    pub expired_tokens: u64,
558}
559
560#[derive(Debug, Clone, Serialize, Deserialize)]
561#[serde(rename_all = "camelCase")]
562pub struct AuthEvent {
563    pub event_type: String,
564    pub username: String,
565    pub user_pool_id: String,
566    pub client_id: Option<String>,
567    pub timestamp: f64,
568    pub success: bool,
569}
570
571#[derive(Debug, Clone, Serialize, Deserialize)]
572#[serde(rename_all = "camelCase")]
573pub struct AuthEventsResponse {
574    pub events: Vec<AuthEvent>,
575}
576
577// ── API Gateway v2 ──────────────────────────────────────────────────
578
579#[derive(Debug, Clone, Serialize, Deserialize)]
580#[serde(rename_all = "camelCase")]
581pub struct ApiGatewayV2Request {
582    pub request_id: String,
583    pub api_id: String,
584    pub stage: String,
585    pub method: String,
586    pub path: String,
587    pub headers: std::collections::HashMap<String, String>,
588    pub query_params: std::collections::HashMap<String, String>,
589    #[serde(skip_serializing_if = "Option::is_none")]
590    pub body: Option<String>,
591    pub timestamp: String,
592    pub status_code: u16,
593}
594
595#[derive(Debug, Clone, Serialize, Deserialize)]
596#[serde(rename_all = "camelCase")]
597pub struct ApiGatewayV2RequestsResponse {
598    pub requests: Vec<ApiGatewayV2Request>,
599}
600
601// ── Bedrock ────────────────────────────────────────────────────────
602
603#[derive(Debug, Clone, Serialize, Deserialize)]
604#[serde(rename_all = "camelCase")]
605pub struct BedrockInvocation {
606    pub model_id: String,
607    pub input: String,
608    pub output: String,
609    pub timestamp: String,
610    /// Error detail for faulted calls, or `None` on success.
611    #[serde(default)]
612    pub error: Option<String>,
613}
614
615#[derive(Debug, Clone, Serialize, Deserialize)]
616#[serde(rename_all = "camelCase")]
617pub struct BedrockInvocationsResponse {
618    pub invocations: Vec<BedrockInvocation>,
619}
620
621#[derive(Debug, Clone, Serialize, Deserialize)]
622#[serde(rename_all = "camelCase")]
623pub struct BedrockModelResponseConfig {
624    pub status: String,
625    pub model_id: String,
626}
627
628/// One rule in a per-model response rule list.
629///
630/// `prompt_contains` is a substring that must appear in the prompt for this
631/// rule to match. `None` or an empty string matches any prompt.
632#[derive(Debug, Clone, Serialize, Deserialize)]
633#[serde(rename_all = "camelCase")]
634pub struct BedrockResponseRule {
635    #[serde(default, skip_serializing_if = "Option::is_none")]
636    pub prompt_contains: Option<String>,
637    pub response: String,
638}
639
640/// Configuration for a fault to inject on Bedrock runtime calls.
641#[derive(Debug, Clone, Serialize, Deserialize, Default)]
642#[serde(rename_all = "camelCase")]
643pub struct BedrockFaultRule {
644    pub error_type: String,
645    #[serde(default, skip_serializing_if = "Option::is_none")]
646    pub message: Option<String>,
647    #[serde(default, skip_serializing_if = "Option::is_none")]
648    pub http_status: Option<u16>,
649    #[serde(default, skip_serializing_if = "Option::is_none")]
650    pub count: Option<u32>,
651    #[serde(default, skip_serializing_if = "Option::is_none")]
652    pub model_id: Option<String>,
653    #[serde(default, skip_serializing_if = "Option::is_none")]
654    pub operation: Option<String>,
655}
656
657/// Server-side view of a queued fault rule.
658#[derive(Debug, Clone, Serialize, Deserialize)]
659#[serde(rename_all = "camelCase")]
660pub struct BedrockFaultRuleState {
661    pub error_type: String,
662    pub message: String,
663    pub http_status: u16,
664    pub remaining: u32,
665    #[serde(default)]
666    pub model_id: Option<String>,
667    #[serde(default)]
668    pub operation: Option<String>,
669}
670
671#[derive(Debug, Clone, Serialize, Deserialize)]
672#[serde(rename_all = "camelCase")]
673pub struct BedrockFaultsResponse {
674    pub faults: Vec<BedrockFaultRuleState>,
675}
676
677#[derive(Debug, Clone, Serialize, Deserialize)]
678#[serde(rename_all = "camelCase")]
679pub struct BedrockStatusResponse {
680    pub status: String,
681}
682
683#[derive(Debug, Clone, Serialize, Deserialize)]
684#[serde(rename_all = "camelCase")]
685pub struct EcrRepository {
686    pub repository_name: String,
687    pub repository_arn: String,
688    pub registry_id: String,
689    pub repository_uri: String,
690    pub image_tag_mutability: String,
691    pub scan_on_push: bool,
692    pub created_at: String,
693    pub tags: Vec<EcrTag>,
694    pub has_policy: bool,
695    pub has_lifecycle_policy: bool,
696    pub image_count: u64,
697    pub layer_count: u64,
698}
699
700#[derive(Debug, Clone, Serialize, Deserialize)]
701#[serde(rename_all = "camelCase")]
702pub struct EcrImage {
703    pub repository_name: String,
704    pub image_digest: String,
705    pub image_tags: Vec<String>,
706    pub image_size_in_bytes: u64,
707    pub image_manifest_media_type: String,
708    pub image_pushed_at: String,
709}
710
711#[derive(Debug, Clone, Serialize, Deserialize)]
712#[serde(rename_all = "camelCase")]
713pub struct EcrImagesResponse {
714    pub images: Vec<EcrImage>,
715}
716
717#[derive(Debug, Clone, Serialize, Deserialize)]
718#[serde(rename_all = "camelCase")]
719pub struct EcrPullThroughRule {
720    pub ecr_repository_prefix: String,
721    pub upstream_registry_url: String,
722    pub upstream_registry: Option<String>,
723    pub credential_arn: Option<String>,
724    pub custom_role_arn: Option<String>,
725    pub created_at: String,
726    pub updated_at: String,
727}
728
729#[derive(Debug, Clone, Serialize, Deserialize)]
730#[serde(rename_all = "camelCase")]
731pub struct EcrPullThroughRulesResponse {
732    pub rules: Vec<EcrPullThroughRule>,
733}
734
735#[derive(Debug, Clone, Serialize, Deserialize)]
736#[serde(rename_all = "camelCase")]
737pub struct EcrTag {
738    pub key: String,
739    pub value: String,
740}
741
742#[derive(Debug, Clone, Serialize, Deserialize)]
743#[serde(rename_all = "camelCase")]
744pub struct EcrRepositoriesResponse {
745    pub repositories: Vec<EcrRepository>,
746}
747
748#[derive(Debug, Clone, Serialize, Deserialize)]
749#[serde(rename_all = "camelCase")]
750pub struct EcsCluster {
751    pub cluster_name: String,
752    pub cluster_arn: String,
753    pub status: String,
754    pub running_tasks_count: i32,
755    pub pending_tasks_count: i32,
756    pub active_services_count: i32,
757    pub registered_container_instances_count: i32,
758    pub capacity_providers: Vec<String>,
759    pub tags: Vec<EcsTag>,
760    pub created_at: String,
761}
762
763#[derive(Debug, Clone, Serialize, Deserialize)]
764#[serde(rename_all = "camelCase")]
765pub struct EcsTag {
766    pub key: String,
767    pub value: String,
768}
769
770#[derive(Debug, Clone, Serialize, Deserialize)]
771#[serde(rename_all = "camelCase")]
772pub struct EcsClustersResponse {
773    pub clusters: Vec<EcsCluster>,
774}
775
776#[derive(Debug, Clone, Serialize, Deserialize)]
777#[serde(rename_all = "camelCase")]
778pub struct EcsTaskContainer {
779    pub name: String,
780    pub image: String,
781    pub last_status: String,
782    pub exit_code: Option<i64>,
783    pub runtime_id: Option<String>,
784    pub essential: bool,
785}
786
787#[derive(Debug, Clone, Serialize, Deserialize)]
788#[serde(rename_all = "camelCase")]
789pub struct EcsTask {
790    pub task_arn: String,
791    pub task_id: String,
792    pub cluster_arn: String,
793    pub cluster_name: String,
794    pub task_definition_arn: String,
795    pub family: String,
796    pub revision: i32,
797    pub last_status: String,
798    pub desired_status: String,
799    pub launch_type: String,
800    pub created_at: String,
801    pub started_at: Option<String>,
802    pub stopping_at: Option<String>,
803    pub stopped_at: Option<String>,
804    pub stop_code: Option<String>,
805    pub stopped_reason: Option<String>,
806    pub containers: Vec<EcsTaskContainer>,
807    pub captured_log_bytes: usize,
808}
809
810#[derive(Debug, Clone, Serialize, Deserialize)]
811#[serde(rename_all = "camelCase")]
812pub struct EcsTasksResponse {
813    pub tasks: Vec<EcsTask>,
814}
815
816#[derive(Debug, Clone, Serialize, Deserialize)]
817#[serde(rename_all = "camelCase")]
818pub struct EcsTaskLogsResponse {
819    pub task_arn: String,
820    pub logs: String,
821    pub last_status: String,
822    pub exit_code: Option<i64>,
823}
824
825#[derive(Debug, Clone, Serialize, Deserialize, Default)]
826#[serde(rename_all = "camelCase")]
827pub struct EcsMarkFailedRequest {
828    pub exit_code: Option<i64>,
829    pub reason: Option<String>,
830}
831
832#[derive(Debug, Clone, Serialize, Deserialize)]
833#[serde(rename_all = "camelCase")]
834pub struct EcsLifecycleEvent {
835    pub at: String,
836    pub event_type: String,
837    pub task_arn: Option<String>,
838    pub cluster_arn: Option<String>,
839    pub last_status: Option<String>,
840    pub detail: serde_json::Value,
841}
842
843#[derive(Debug, Clone, Serialize, Deserialize)]
844#[serde(rename_all = "camelCase")]
845pub struct EcsEventsResponse {
846    pub events: Vec<EcsLifecycleEvent>,
847}
848
849// ── ELBv2 ───────────────────────────────────────────────────────────
850
851#[derive(Debug, Clone, Serialize, Deserialize)]
852#[serde(rename_all = "camelCase")]
853pub struct Elbv2LoadBalancer {
854    pub arn: String,
855    pub name: String,
856    pub dns_name: String,
857    pub scheme: String,
858    pub vpc_id: String,
859    pub state_code: String,
860    pub state_reason: Option<String>,
861    pub lb_type: String,
862    pub ip_address_type: String,
863    pub availability_zones: Vec<Elbv2AvailabilityZone>,
864    pub security_groups: Vec<String>,
865    pub created_time: String,
866    pub tags: Vec<Elbv2Tag>,
867    /// In-process data plane TCP port for ALBs. `None` for NLB/GWLB
868    /// or when the data plane is disabled. Tests connect to
869    /// `127.0.0.1:<bound_port>` to reach the routed targets.
870    #[serde(skip_serializing_if = "Option::is_none")]
871    pub bound_port: Option<u16>,
872}
873
874#[derive(Debug, Clone, Serialize, Deserialize)]
875#[serde(rename_all = "camelCase")]
876pub struct Elbv2AvailabilityZone {
877    pub zone_name: String,
878    pub subnet_id: String,
879}
880
881#[derive(Debug, Clone, Serialize, Deserialize)]
882#[serde(rename_all = "camelCase")]
883pub struct Elbv2Tag {
884    pub key: String,
885    pub value: String,
886}
887
888#[derive(Debug, Clone, Serialize, Deserialize)]
889#[serde(rename_all = "camelCase")]
890pub struct Elbv2LoadBalancersResponse {
891    pub load_balancers: Vec<Elbv2LoadBalancer>,
892}
893
894#[derive(Debug, Clone, Serialize, Deserialize)]
895#[serde(rename_all = "camelCase")]
896pub struct Elbv2TargetGroup {
897    pub arn: String,
898    pub name: String,
899    pub protocol: Option<String>,
900    pub port: Option<i32>,
901    pub vpc_id: Option<String>,
902    pub target_type: String,
903    pub load_balancer_arns: Vec<String>,
904    pub targets: Vec<Elbv2Target>,
905    pub health_check_protocol: Option<String>,
906    pub health_check_port: Option<String>,
907    pub health_check_path: Option<String>,
908    pub healthy_threshold_count: i32,
909    pub unhealthy_threshold_count: i32,
910    pub created_time: String,
911    pub tags: Vec<Elbv2Tag>,
912}
913
914#[derive(Debug, Clone, Serialize, Deserialize)]
915#[serde(rename_all = "camelCase")]
916pub struct Elbv2Target {
917    pub id: String,
918    pub port: Option<i32>,
919    pub availability_zone: Option<String>,
920    pub health_state: String,
921    pub health_reason: Option<String>,
922    pub health_description: Option<String>,
923}
924
925#[derive(Debug, Clone, Serialize, Deserialize)]
926#[serde(rename_all = "camelCase")]
927pub struct Elbv2TargetGroupsResponse {
928    pub target_groups: Vec<Elbv2TargetGroup>,
929}
930
931#[derive(Debug, Clone, Serialize, Deserialize)]
932#[serde(rename_all = "camelCase")]
933pub struct Elbv2Listener {
934    pub arn: String,
935    pub load_balancer_arn: String,
936    pub port: Option<i32>,
937    pub protocol: Option<String>,
938    pub ssl_policy: Option<String>,
939    pub certificate_arns: Vec<String>,
940    pub default_action_type: Option<String>,
941    pub default_target_group_arn: Option<String>,
942}
943
944#[derive(Debug, Clone, Serialize, Deserialize)]
945#[serde(rename_all = "camelCase")]
946pub struct Elbv2ListenersResponse {
947    pub listeners: Vec<Elbv2Listener>,
948}
949
950#[derive(Debug, Clone, Serialize, Deserialize)]
951#[serde(rename_all = "camelCase")]
952pub struct Elbv2Rule {
953    pub arn: String,
954    pub listener_arn: String,
955    pub priority: String,
956    pub is_default: bool,
957    pub condition_fields: Vec<String>,
958    pub action_type: Option<String>,
959}
960
961#[derive(Debug, Clone, Serialize, Deserialize)]
962#[serde(rename_all = "camelCase")]
963pub struct Elbv2RulesResponse {
964    pub rules: Vec<Elbv2Rule>,
965}
966
967/// Request to bootstrap an IAM admin user in a specific account.
968/// Used by `/_fakecloud/iam/create-admin` to solve the multi-account
969/// bootstrap problem: there's no per-account root credential, so this
970/// endpoint creates a user with full admin access in any account.
971#[derive(Debug, Clone, Serialize, Deserialize)]
972#[serde(rename_all = "camelCase")]
973pub struct CreateAdminRequest {
974    pub account_id: String,
975    pub user_name: String,
976}
977
978#[derive(Debug, Clone, Serialize, Deserialize)]
979#[serde(rename_all = "camelCase")]
980pub struct CreateAdminResponse {
981    pub access_key_id: String,
982    pub secret_access_key: String,
983    pub account_id: String,
984    pub arn: String,
985}