Skip to main content

az_device_contract_codegen/
render.rs

1mod 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}