zerodds-corba-rust 1.0.0-rc.1

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: emittiert basic
//! `ComponentServant`/`ComponentHome`-Trait-Impl-Skelette mit
//! Repository-ID + Receptacle-/Facet-Skeleton-Stubs. Phase-2 erweitert
//! mit echtem Container-Lifecycle (configuration_complete, ccm_activate,
//! ccm_passivate, ccm_remove) und CCM-Event-Channel-Bindings.

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

use crate::error::Result;

/// Emittiert eine IDL-`component`-Definition als 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 fuer 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: wird vom Container nach Config-Phase aufgerufen.\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: wird vom Container vor Removal aufgerufen.\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(())
}

/// Emittiert eine IDL-`home`-Definition als 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 fuer 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(())
}