hemmer_provider_generator_parser/lib.rs
1//! SDK parsing for cloud provider definitions
2//!
3//! This crate handles parsing of various cloud provider SDK definitions
4//! into an intermediate representation (`ServiceDefinition`).
5//!
6//! ## Parsing Strategy
7//!
8//! ### Spec-Based Parsing (Recommended)
9//! - **AWS**: Parse Smithy JSON AST from github.com/aws/api-models-aws
10//! - **Kubernetes**: Parse OpenAPI 3.0 specs from API server
11//! - **GCP**: Parse Discovery Documents from googleapis.com or gRPC FileDescriptorSet
12//! - **Azure**: Parse OpenAPI specs from github.com/Azure/azure-rest-api-specs
13//! - **gRPC**: Parse Protocol Buffer FileDescriptorSet from .proto files or gRPC reflection
14//!
15//! ### Legacy Parsing
16//! For AWS SDK for Rust, we parse the published crate structure:
17//! - `operation::*` modules contain Input/Output types for each operation
18//! - `types::*` module contains data types used by operations
19//!
20//! Operations are grouped by resource and mapped to CRUD:
21//! - CreateX, PutX → Create
22//! - GetX, DescribeX, HeadX → Read
23//! - UpdateX, ModifyX, PutX → Update
24//! - DeleteX, RemoveX → Delete
25
26mod aws;
27mod operation_mapper;
28mod rustdoc_loader;
29mod type_mapper;
30
31// Spec format parsers
32pub mod discovery;
33pub mod openapi;
34pub mod protobuf;
35pub mod smithy;
36
37pub use aws::AwsParser;
38pub use discovery::DiscoveryParser;
39pub use openapi::OpenApiParser;
40pub use operation_mapper::{CrudOperation, OperationClassifier};
41pub use protobuf::ProtobufParser;
42pub use rustdoc_loader::RustdocLoader;
43pub use smithy::SmithyParser;
44pub use type_mapper::TypeMapper;
45
46use hemmer_provider_generator_common::{Result, ServiceDefinition};
47
48/// Parse AWS SDK service from metadata
49///
50/// # Arguments
51/// * `service_name` - Name of the AWS service (e.g., "s3", "ec2")
52/// * `sdk_version` - Version of the AWS SDK
53///
54/// # Returns
55/// * `ServiceDefinition` - Intermediate representation of the service
56pub fn parse_aws_service(service_name: &str, sdk_version: &str) -> Result<ServiceDefinition> {
57 let parser = AwsParser::new(service_name, sdk_version);
58 parser.parse()
59}
60
61#[cfg(test)]
62mod tests {
63 use super::*;
64
65 #[test]
66 fn test_parse_aws_service() {
67 // This will fail until we implement the parser
68 let result = parse_aws_service("s3", "1.0.0");
69 assert!(result.is_ok() || result.is_err()); // Placeholder test
70 }
71}