Files
foxhunt/services/api_gateway/build.rs
jgrusewski b70c6a0bd7 refactor: rewire all service build.rs to proto/ root directory
Delete per-service proto/ directories. All 7 services now compile
from the single canonical proto/ at workspace root.

- trading_service: 5 protos + ml_training client -> ../../proto/
- ml_training_service: ml_training server + fxt_trading client -> ../../proto/
- broker_gateway_service: broker_gateway -> ../../proto/
- trading_agent_service: trading_agent + ml client -> ../../proto/
- data_acquisition_service: data_acquisition -> ../../proto/
- api_gateway: 8 proto compilations -> ../../proto/
- monitoring_service: keeps local proto (3 training RPCs only, deleted in Task 5)

Added proto/fxt_trading.proto (fat-client proto, package foxhunt.tli)
separate from proto/trading.proto (backend, package trading) since the
API gateway needs both for protocol translation.

Added unimplemented stubs for merged monitoring.proto RPCs:
- trading_service: 3 training RPCs (served by monitoring_service)
- api_gateway monitoring_proxy: 13 system health RPCs (Task 4)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 20:34:09 +01:00

155 lines
6.7 KiB
Rust

//! Build script for API Gateway service
//!
//! Compiles protobuf definitions from the canonical proto/ directory at workspace root.
//! Proto packages:
//! - `foxhunt.tli` (fxt_trading.proto) - Fat-client unified interface (server+client)
//! - `trading` (trading.proto) - Backend trading service (client-only)
//! - `foxhunt.config` (config_service.proto) - Config service (server+client)
//! - `risk` (risk.proto) - Risk service (client-only)
//! - `monitoring` (monitoring.proto) - Monitoring service (server+client)
//! - `config` (config.proto) - Config backend (client-only)
//! - `ml_training` (ml_training.proto) - ML Training service (server+client)
//! - `trading_agent` (trading_agent.proto) - Trading Agent service (server+client)
fn main() -> Result<(), Box<dyn std::error::Error>> {
// NOTE: Tonic 0.14+ uses tonic_prost_build instead of tonic_build
let config = tonic_prost_build::configure();
let out_dir = std::path::PathBuf::from(std::env::var("OUT_DIR")?);
// Compile Config Service proto (foxhunt.config package)
config
.clone()
.build_server(true)
.build_client(true)
.file_descriptor_set_path(out_dir.join("config_service_descriptor.bin"))
.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 fat-client TLI proto (package: foxhunt.tli) — server+client
// Contains TradingService, BacktestingService, and MLService
// API Gateway acts as server for incoming client requests
config
.clone()
.build_server(true)
.build_client(true)
.file_descriptor_set_path(out_dir.join("tli_descriptor.bin"))
.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/fxt_trading.proto"],
&["../../proto"],
)?;
// Compile Trading Service backend proto (package: trading) — client-only
// API Gateway forwards translated requests to Trading Service
config
.clone()
.build_server(false)
.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/trading.proto"],
&["../../proto"],
)?;
// Compile Risk Service proto (package: risk) — client-only
config
.clone()
.build_server(false)
.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/risk.proto"],
&["../../proto"],
)?;
// Compile Monitoring Service proto (package: monitoring) — server+client
config
.clone()
.build_server(true)
.build_client(true)
.file_descriptor_set_path(out_dir.join("monitoring_descriptor.bin"))
.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/monitoring.proto"],
&["../../proto"],
)?;
// Compile Config backend proto (package: config) — client-only
config
.clone()
.build_server(false)
.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.proto"],
&["../../proto"],
)?;
// Compile ML Training Service proto (package: ml_training) — server+client
config
.clone()
.build_server(true)
.build_client(true)
.file_descriptor_set_path(out_dir.join("ml_training_descriptor.bin"))
.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/ml_training.proto"],
&["../../proto"],
)?;
// Compile Trading Agent Service proto (package: trading_agent) — server+client
config
.build_server(true)
.build_client(true)
.file_descriptor_set_path(out_dir.join("trading_agent_descriptor.bin"))
.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/trading_agent.proto"],
&["../../proto"],
)?;
println!("cargo:rerun-if-changed=../../proto/config_service.proto");
println!("cargo:rerun-if-changed=../../proto/fxt_trading.proto");
println!("cargo:rerun-if-changed=../../proto/trading.proto");
println!("cargo:rerun-if-changed=../../proto/risk.proto");
println!("cargo:rerun-if-changed=../../proto/monitoring.proto");
println!("cargo:rerun-if-changed=../../proto/config.proto");
println!("cargo:rerun-if-changed=../../proto/ml_training.proto");
println!("cargo:rerun-if-changed=../../proto/trading_agent.proto");
Ok(())
}