Skip to main content

spikard_cli/codegen/protobuf/generators/
mod.rs

1//! Language-specific Protobuf code generators.
2//!
3//! Each generator implements the `ProtobufGenerator` trait to provide
4//! language-specific code generation from Protobuf specifications.
5
6pub mod base;
7pub mod elixir;
8pub mod php;
9pub mod python;
10pub mod ruby;
11pub mod rust_lang;
12pub mod typescript;
13
14use super::spec_parser::ProtobufSchema;
15use anyhow::Result;
16
17/// Target specification for Protobuf code generation
18#[derive(Debug, Clone, Copy, PartialEq, Eq)]
19pub enum ProtobufTarget {
20    /// Generate only message definitions
21    Messages,
22    /// Generate only service definitions
23    Services,
24    /// Generate all code (messages, services, utilities)
25    All,
26}
27
28/// Language-agnostic Protobuf code generator trait
29///
30/// Implementations provide language-specific code generation for:
31/// - Message type definitions and serialization
32/// - Service client and server implementations
33/// - RPC method stubs and handlers
34pub trait ProtobufGenerator {
35    /// Generate message definitions and serialization code
36    fn generate_messages(&self, schema: &ProtobufSchema) -> Result<String>;
37
38    /// Generate service definitions and RPC implementations
39    fn generate_services(&self, schema: &ProtobufSchema) -> Result<String>;
40
41    /// Generate complete code (messages, services, and utilities)
42    fn generate_complete(&self, schema: &ProtobufSchema) -> Result<String> {
43        let messages = self.generate_messages(schema)?;
44        let services = self.generate_services(schema)?;
45        Ok(format!("{messages}\n\n{services}"))
46    }
47}
48
49#[cfg(test)]
50mod tests {
51    use super::*;
52
53    #[test]
54    fn test_protobuf_target_enum() {
55        assert_eq!(ProtobufTarget::Messages, ProtobufTarget::Messages);
56        assert_ne!(ProtobufTarget::Messages, ProtobufTarget::Services);
57        assert_ne!(ProtobufTarget::All, ProtobufTarget::Messages);
58    }
59}