az_device_contract_codegen/
render.rs1mod artifact;
2mod c;
3mod markdown;
4mod rust;
5
6use crate::model::{ContractRenderRequest, GeneratedBundle, ServiceSummary};
7use crate::planner::{build_plan, normalize_type_name, trim_option, ContractPlanError};
8
9pub fn generate_bundle(
10 request: &ContractRenderRequest,
11) -> Result<GeneratedBundle, ContractPlanError> {
12 let plan = build_plan(request)?;
13 let mut artifacts = Vec::new();
14 let primary_transport = request.transports[0].clone();
15
16 artifacts.extend(c::render_common_c_artifacts(&plan, &primary_transport));
17 for transport in &request.transports {
18 artifacts.push(markdown::render_markdown_artifact(&plan, transport));
19 artifacts.push(rust::render_rust_artifact(&plan, transport));
20 artifacts.extend(c::render_transport_c_artifacts(&plan, transport));
21 }
22
23 let services = request
24 .services
25 .iter()
26 .map(|service| ServiceSummary {
27 api_kind: service.api_kind.as_str().to_string(),
28 interface_package: "site.addzero.okmy.dics.generated.modbus".to_string(),
29 interface_simple_name: normalize_type_name(&service.interface_name),
30 summary: trim_option(&service.interface_summary).unwrap_or_default(),
31 operation_count: service.methods.len() as i64,
32 })
33 .collect::<Vec<_>>();
34
35 Ok(GeneratedBundle {
36 summary: format!(
37 "已规划 {} 个服务、{} 个文件",
38 services.len(),
39 artifacts.len()
40 ),
41 artifacts,
42 services,
43 })
44}