olai_codegen/parsing/
mod.rs1use std::collections::HashMap;
2
3pub use self::http::{HttpPattern, UrlSegment, extract_http_rule_pattern, extract_path_parameters};
4pub use self::models::*;
5use protobuf::descriptor::{FileDescriptorProto, FileDescriptorSet, SourceCodeInfo};
6pub mod types;
7use crate::Result;
8
9mod enum_parser;
10pub mod http;
11mod message;
12mod models;
13mod service;
14
15pub(super) fn extract_documentation(sci: Option<&SourceCodeInfo>, path: &[i32]) -> Option<String> {
20 let sci = sci?;
21 for location in &sci.location {
22 if location.path.as_slice() == path {
23 let text = if location.has_leading_comments() {
24 location.leading_comments().trim().to_string()
25 } else if location.has_trailing_comments() {
26 location.trailing_comments().trim().to_string()
27 } else {
28 String::new()
29 };
30 if !text.is_empty() {
31 return Some(text);
32 }
33 }
34 }
35 None
36}
37
38const GOOGLE_API_HTTP_EXTENSION: u32 = 72295728; const GNOSTIC_OPERATION_EXTENSION: u32 = 1143; const GOOGLE_API_RESOURCE_EXTENSION: u32 = 1053; const GOOGLE_API_FIELD_BEHAVIOR_EXTENSION: u32 = 1052; const GOOGLE_API_RESOURCE_REFERENCE_EXTENSION: u32 = 1055; pub fn parse_file_descriptor_set(
80 file_descriptor_set: &FileDescriptorSet,
81) -> Result<CodeGenMetadata> {
82 let mut codegen_metadata = CodeGenMetadata {
83 messages: HashMap::new(),
84 enums: HashMap::new(),
85 services: HashMap::new(),
86 };
87
88 for file_descriptor in &file_descriptor_set.file {
90 process_file_descriptor(file_descriptor, &mut codegen_metadata)?;
91 }
92
93 Ok(codegen_metadata)
94}
95
96pub fn process_file_descriptor(
101 file_desc: &FileDescriptorProto,
102 codegen_metadata: &mut CodeGenMetadata,
103) -> Result<()> {
104 let file_name = file_desc.name();
105
106 let source_code_info = file_desc.source_code_info.as_ref();
108
109 for (enum_index, enum_desc) in file_desc.enum_type.iter().enumerate() {
111 let package_name = file_desc.package();
112 let type_prefix = if package_name.is_empty() {
113 String::new()
114 } else {
115 format!(".{}", package_name)
116 };
117 enum_parser::process_enum(
118 enum_desc,
119 codegen_metadata,
120 &type_prefix,
121 source_code_info,
122 &[5, enum_index as i32], )?;
124 }
125
126 for (message_index, message) in file_desc.message_type.iter().enumerate() {
128 let package_name = file_desc.package();
129 let type_prefix = if package_name.is_empty() {
130 String::new()
131 } else {
132 format!(".{}", package_name)
133 };
134
135 message::process_message(
136 message,
137 file_name,
138 codegen_metadata,
139 &type_prefix,
140 source_code_info,
141 &[4, message_index as i32], )?;
143 }
144
145 let package_name = file_desc.package().to_string();
147 for (service_index, service) in file_desc.service.iter().enumerate() {
148 service::process_service(
149 service,
150 &package_name,
151 codegen_metadata,
152 source_code_info,
153 service_index,
154 )?;
155 }
156
157 Ok(())
158}