Skip to main content

zerodds_corba_rust/
component_emit.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright 2026 ZeroDDS Contributors
3//! IDL `component` / `home` → Rust trait + Servant.
4//!
5//! CCM 4.0 §6 Component-Mapping. Phase-1: emittiert basic
6//! `ComponentServant`/`ComponentHome`-Trait-Impl-Skelette mit
7//! Repository-ID + Receptacle-/Facet-Skeleton-Stubs. Phase-2 erweitert
8//! mit echtem Container-Lifecycle (configuration_complete, ccm_activate,
9//! ccm_passivate, ccm_remove) und CCM-Event-Channel-Bindings.
10
11use zerodds_idl::ast::types::{ComponentDcl, HomeDcl};
12
13use crate::error::Result;
14
15/// Emittiert eine IDL-`component`-Definition als Rust-Trait + Servant.
16pub fn emit_component(out: &mut String, c: &ComponentDcl) -> Result<()> {
17    let name = match c {
18        ComponentDcl::Def(def) => &def.name.text,
19        ComponentDcl::Forward(_, _) => return Ok(()),
20    };
21    let repo_id = zerodds_corba_codegen::build_repository_id(&[], name, 1, 0);
22    let repo_const = name.to_ascii_uppercase();
23    out.push_str("/// Generated by `zerodds-corba-rust` from IDL component (CCM 4.0 §6).\n");
24    out.push_str(&format!(
25        "/// CORBA Repository-ID fuer Component `{name}`.\npub const {repo_const}_REPOSITORY_ID: &str = \"{repo_id}\";\n"
26    ));
27    out.push_str(&format!(
28        "pub trait {name}: zerodds_corba_rust::ComponentServant {{\n"
29    ));
30    out.push_str("    /// CCM-Lifecycle: wird vom Container nach Config-Phase aufgerufen.\n");
31    out.push_str("    fn configuration_complete(&mut self) -> ::core::result::Result<(), zerodds_corba_rust::CorbaException> {\n");
32    out.push_str("        ::core::result::Result::Ok(())\n");
33    out.push_str("    }\n");
34    out.push_str("    /// CCM-Lifecycle: wird vom Container vor Removal aufgerufen.\n");
35    out.push_str("    fn ccm_remove(&mut self) -> ::core::result::Result<(), zerodds_corba_rust::CorbaException> {\n");
36    out.push_str("        ::core::result::Result::Ok(())\n");
37    out.push_str("    }\n");
38    out.push_str("}\n");
39    Ok(())
40}
41
42/// Emittiert eine IDL-`home`-Definition als Rust-Home-Trait.
43pub fn emit_home(out: &mut String, h: &HomeDcl) -> Result<()> {
44    let name = match h {
45        HomeDcl::Def(def) => &def.name.text,
46        HomeDcl::Forward(_, _) => return Ok(()),
47    };
48    let repo_id = zerodds_corba_codegen::build_repository_id(&[], name, 1, 0);
49    let repo_const = name.to_ascii_uppercase();
50    out.push_str("/// Generated by `zerodds-corba-rust` from IDL home (CCM 4.0 §6.5).\n");
51    out.push_str(&format!(
52        "/// CORBA Repository-ID fuer Home `{name}`.\npub const {repo_const}_REPOSITORY_ID: &str = \"{repo_id}\";\n"
53    ));
54    out.push_str(&format!(
55        "pub trait {name}: zerodds_corba_rust::ComponentHome {{\n"
56    ));
57    out.push_str("}\n");
58    Ok(())
59}