zerodds-corba-rust 1.0.0-rc.3

IDL → Rust code generator for CORBA service constructs (interfaces, valuetypes, components, homes) — analogous to zerodds-idl-cpp/-csharp/-java but for Rust output.
Documentation
// SPDX-License-Identifier: Apache-2.0
// Copyright 2026 ZeroDDS Contributors
//! IDL `component` / `home` → Rust trait + Servant.
//!
//! CCM 4.0 §6 component mapping. Phase 1: emits basic
//! `ComponentServant`/`ComponentHome` trait-impl skeletons with
//! repository ID + receptacle/facet skeleton stubs. Phase 2 extends this
//! with a real container lifecycle (configuration_complete, ccm_activate,
//! ccm_passivate, ccm_remove) and CCM event-channel bindings.

use zerodds_idl::ast::types::{ComponentDcl, HomeDcl};

use crate::error::Result;

/// Emits an IDL `component` definition as a Rust trait + Servant.
pub fn emit_component(out: &mut String, c: &ComponentDcl) -> Result<()> {
    let name = match c {
        ComponentDcl::Def(def) => &def.name.text,
        ComponentDcl::Forward(_, _) => return Ok(()),
    };
    let repo_id = zerodds_corba_codegen::build_repository_id(&[], name, 1, 0);
    let repo_const = name.to_ascii_uppercase();
    out.push_str("/// Generated by `zerodds-corba-rust` from IDL component (CCM 4.0 §6).\n");
    out.push_str(&format!(
        "/// CORBA Repository-ID for component `{name}`.\npub const {repo_const}_REPOSITORY_ID: &str = \"{repo_id}\";\n"
    ));
    out.push_str(&format!(
        "pub trait {name}: zerodds_corba_rust::ComponentServant {{\n"
    ));
    out.push_str("    /// CCM lifecycle: called by the container after the config phase.\n");
    out.push_str("    fn configuration_complete(&mut self) -> ::core::result::Result<(), zerodds_corba_rust::CorbaException> {\n");
    out.push_str("        ::core::result::Result::Ok(())\n");
    out.push_str("    }\n");
    out.push_str("    /// CCM lifecycle: called by the container before removal.\n");
    out.push_str("    fn ccm_remove(&mut self) -> ::core::result::Result<(), zerodds_corba_rust::CorbaException> {\n");
    out.push_str("        ::core::result::Result::Ok(())\n");
    out.push_str("    }\n");
    out.push_str("}\n");
    Ok(())
}

/// Emits an IDL `home` definition as a Rust home trait.
pub fn emit_home(out: &mut String, h: &HomeDcl) -> Result<()> {
    let name = match h {
        HomeDcl::Def(def) => &def.name.text,
        HomeDcl::Forward(_, _) => return Ok(()),
    };
    let repo_id = zerodds_corba_codegen::build_repository_id(&[], name, 1, 0);
    let repo_const = name.to_ascii_uppercase();
    out.push_str("/// Generated by `zerodds-corba-rust` from IDL home (CCM 4.0 §6.5).\n");
    out.push_str(&format!(
        "/// CORBA Repository-ID for home `{name}`.\npub const {repo_const}_REPOSITORY_ID: &str = \"{repo_id}\";\n"
    ));
    out.push_str(&format!(
        "pub trait {name}: zerodds_corba_rust::ComponentHome {{\n"
    ));
    out.push_str("}\n");
    Ok(())
}