//! Build script for API Gateway service //! //! Compiles protobuf definitions for: //! - Config service (`foxhunt.config` from `config_service.proto`) //! - TLI services (`Trading`, `Backtesting`, `MLService` from `trading.proto`) - client-facing interface //! - Trading Service backend (`trading.proto`) - backend trading service interface //! - Risk Service backend (`risk.proto`) - backend risk service interface //! - Monitoring Service backend (`monitoring.proto`) - backend monitoring service interface //! - Config Service backend (`config.proto`) - backend config service interface //! - Trading Service backend (`trading.proto`) - backend service interface //! - ML Training Service (`ml_training.proto`) fn main() -> Result<(), Box> { // NOTE: Tonic 0.14+ uses tonic_prost_build instead of tonic_build let config = tonic_prost_build::configure(); // Compile Config Service proto config .clone() .build_server(true) .build_client(true) .compile_well_known_types(true) .extern_path(".google.protobuf", "::prost_types") .type_attribute(".", "#[derive(serde::Serialize, serde::Deserialize)]") .server_mod_attribute(".", "#[allow(unused_qualifications)]") .client_mod_attribute(".", "#[allow(unused_qualifications)]") .compile_protos( &["proto/config_service.proto"], &["proto"] )?; // Compile TLI proto which contains TradingService, BacktestingService, and MLService // API Gateway acts as server (receives requests from TLI clients) // Keep client generation for backtesting_proxy compatibility config .clone() .build_server(true) // Act as server for incoming requests .build_client(true) // Generate client for backtesting service compatibility .compile_well_known_types(true) .extern_path(".google.protobuf", "::prost_types") .type_attribute(".", "#[derive(serde::Serialize, serde::Deserialize)]") .server_mod_attribute(".", "#[allow(unused_qualifications)]") .client_mod_attribute(".", "#[allow(unused_qualifications)]") .compile_protos( &["../../tli/proto/trading.proto"], &["../../tli/proto"] )?; // Compile Trading Service backend proto (package: trading) // API Gateway acts as client (forwards translated requests to Trading Service) config .clone() .build_server(false) // API Gateway is only a client to Trading Service .build_client(true) // Generate client to call backend .compile_well_known_types(true) .extern_path(".google.protobuf", "::prost_types") .type_attribute(".", "#[derive(serde::Serialize, serde::Deserialize)]") .server_mod_attribute(".", "#[allow(unused_qualifications)]") .client_mod_attribute(".", "#[allow(unused_qualifications)]") .compile_protos( &["../trading_service/proto/trading.proto"], &["../trading_service/proto"] )?; // Compile Risk Service backend proto (package: risk) // API Gateway acts as client (forwards translated requests to Risk Service) config .clone() .build_server(false) // API Gateway is only a client to Risk Service .build_client(true) // Generate client to call backend .compile_well_known_types(true) .extern_path(".google.protobuf", "::prost_types") .type_attribute(".", "#[derive(serde::Serialize, serde::Deserialize)]") .server_mod_attribute(".", "#[allow(unused_qualifications)]") .client_mod_attribute(".", "#[allow(unused_qualifications)]") .compile_protos( &["../trading_service/proto/risk.proto"], &["../trading_service/proto"] )?; // Compile Monitoring Service backend proto (package: monitoring) // API Gateway acts as client (forwards translated requests to Monitoring Service) config .clone() .build_server(false) // API Gateway is only a client to Monitoring Service .build_client(true) // Generate client to call backend .compile_well_known_types(true) .extern_path(".google.protobuf", "::prost_types") .type_attribute(".", "#[derive(serde::Serialize, serde::Deserialize)]") .server_mod_attribute(".", "#[allow(unused_qualifications)]") .client_mod_attribute(".", "#[allow(unused_qualifications)]") .compile_protos( &["../trading_service/proto/monitoring.proto"], &["../trading_service/proto"] )?; // Compile Config Service backend proto (package: config) // API Gateway acts as client (forwards translated requests to Config Service) config .clone() .build_server(false) // API Gateway is only a client to Config Service .build_client(true) // Generate client to call backend .compile_well_known_types(true) .extern_path(".google.protobuf", "::prost_types") .type_attribute(".", "#[derive(serde::Serialize, serde::Deserialize)]") .server_mod_attribute(".", "#[allow(unused_qualifications)]") .client_mod_attribute(".", "#[allow(unused_qualifications)]") .compile_protos( &["../trading_service/proto/config.proto"], &["../trading_service/proto"] )?; // Compile ML Training Service protobuf (client + server for proxying) config .clone() .build_server(true) // API Gateway acts as server (receives proxy requests) .build_client(true) // API Gateway acts as client (forwards to backend) .compile_well_known_types(true) .extern_path(".google.protobuf", "::prost_types") .type_attribute(".", "#[derive(serde::Serialize, serde::Deserialize)]") .server_mod_attribute(".", "#[allow(unused_qualifications)]") .client_mod_attribute(".", "#[allow(unused_qualifications)]") .compile_protos( &["../ml_training_service/proto/ml_training.proto"], &["../ml_training_service/proto"] )?; // Compile Trading Agent Service protobuf (client + server for proxying) config .clone() .build_server(true) // API Gateway acts as server (receives proxy requests) .build_client(true) // API Gateway acts as client (forwards to backend) .compile_well_known_types(true) .extern_path(".google.protobuf", "::prost_types") .type_attribute(".", "#[derive(serde::Serialize, serde::Deserialize)]") .server_mod_attribute(".", "#[allow(unused_qualifications)]") .client_mod_attribute(".", "#[allow(unused_qualifications)]") .compile_protos( &["../trading_agent_service/proto/trading_agent.proto"], &["../trading_agent_service/proto"] )?; println!("cargo:rerun-if-changed=proto/config_service.proto"); println!("cargo:rerun-if-changed=../../tli/proto/trading.proto"); println!("cargo:rerun-if-changed=../trading_service/proto/trading.proto"); println!("cargo:rerun-if-changed=../trading_service/proto/risk.proto"); println!("cargo:rerun-if-changed=../trading_service/proto/monitoring.proto"); println!("cargo:rerun-if-changed=../trading_service/proto/config.proto"); println!("cargo:rerun-if-changed=../ml_training_service/proto/ml_training.proto"); println!("cargo:rerun-if-changed=../trading_agent_service/proto/trading_agent.proto"); Ok(()) }