Skip to main content

spikard_cli/codegen/openrpc/
mod.rs

1//! `OpenRPC` 1.3.2 specification parsing and code generation
2//!
3//! This module orchestrates `OpenRPC` spec parsing and code generation across
4//! multiple languages. The actual generation logic is delegated to language-specific
5//! generators in the `generators/` module.
6//!
7//! `OpenRPC` is the standard for describing JSON-RPC 2.0 APIs.
8
9pub mod generators;
10pub mod spec_parser;
11
12pub use generators::{
13    ElixirOpenRpcGenerator, OpenRpcGenerator, PhpOpenRpcGenerator, PythonOpenRpcGenerator, RubyOpenRpcGenerator,
14    RustOpenRpcGenerator, TypeScriptOpenRpcGenerator,
15};
16pub use spec_parser::parse_openrpc_schema;
17
18use anyhow::Result;
19use spec_parser::OpenRpcSpec;
20
21/// Generate Python handler scaffolding from `OpenRPC` spec
22pub fn generate_python_handler_app(spec: &OpenRpcSpec) -> Result<String> {
23    let generator = PythonOpenRpcGenerator;
24    generator.generate_handler_app(spec)
25}
26
27/// Generate TypeScript handler scaffolding from `OpenRPC` spec
28pub fn generate_typescript_handler_app(spec: &OpenRpcSpec) -> Result<String> {
29    let generator = TypeScriptOpenRpcGenerator;
30    generator.generate_handler_app(spec)
31}
32
33/// Generate Ruby handler scaffolding from `OpenRPC` spec
34pub fn generate_ruby_handler_app(spec: &OpenRpcSpec) -> Result<String> {
35    let generator = RubyOpenRpcGenerator;
36    generator.generate_handler_app(spec)
37}
38
39/// Generate Rust handler scaffolding from `OpenRPC` spec
40pub fn generate_rust_handler_app(spec: &OpenRpcSpec) -> Result<String> {
41    let generator = RustOpenRpcGenerator;
42    generator.generate_handler_app(spec)
43}
44
45/// Generate PHP handler scaffolding from `OpenRPC` spec
46pub fn generate_php_handler_app(spec: &OpenRpcSpec) -> Result<String> {
47    let generator = PhpOpenRpcGenerator;
48    generator.generate_handler_app(spec)
49}
50
51/// Generate Elixir handler scaffolding from `OpenRPC` spec
52pub fn generate_elixir_handler_app(spec: &OpenRpcSpec) -> Result<String> {
53    let generator = ElixirOpenRpcGenerator;
54    generator.generate_handler_app(spec)
55}
56
57#[cfg(test)]
58mod tests {
59    use super::*;
60
61    #[test]
62    fn test_openrpc_module_exports() {
63        let _: fn(&OpenRpcSpec) -> Result<String> = generate_python_handler_app;
64        let _: fn(&OpenRpcSpec) -> Result<String> = generate_typescript_handler_app;
65        let _: fn(&OpenRpcSpec) -> Result<String> = generate_rust_handler_app;
66        let _: fn(&OpenRpcSpec) -> Result<String> = generate_ruby_handler_app;
67        let _: fn(&OpenRpcSpec) -> Result<String> = generate_php_handler_app;
68        let _: fn(&OpenRpcSpec) -> Result<String> = generate_elixir_handler_app;
69    }
70
71    #[test]
72    fn test_openrpc_module_can_parse_and_generate() {
73        let schema_path = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR"))
74            .join("../../testing_data/schemas/user-api.openrpc.json");
75        let spec = parse_openrpc_schema(&schema_path).expect("OpenRPC schema should parse");
76
77        let ts = generate_typescript_handler_app(&spec).expect("TypeScript scaffold should generate");
78        assert!(ts.contains("handleJsonRpcCall"));
79    }
80}