use blueprint_core::info;
use clap::Parser;
use std::path::PathBuf;
use tokio::sync::mpsc;
use blueprint_pricing_engine_lib::{
cleanup, error::Result, init_benchmark_cache, init_operator_signer, init_pricing_config,
load_operator_config, service::blockchain::event::BlockchainEvent,
service::rpc::server::run_rpc_server, spawn_event_processor, start_blockchain_listener,
wait_for_shutdown,
};
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
pub struct Cli {
#[arg(
short,
long,
value_name = "FILE",
env = "OPERATOR_CONFIG_PATH",
default_value = "config/operator.toml"
)]
pub config: PathBuf,
#[arg(
long,
value_name = "FILE",
env = "PRICING_CONFIG_PATH",
default_value = "config/default_pricing.toml"
)]
pub pricing_config: PathBuf,
#[arg(
long,
value_name = "URL",
env = "OPERATOR_NODE_URL",
default_value = "ws://127.0.0.1:9944"
)]
pub node_url: String,
#[arg(long, value_name = "LEVEL", env = "RUST_LOG", default_value = "info")]
pub log_level: String,
}
pub async fn run_app(cli: Cli) -> Result<()> {
info!("Starting Tangle Cloud Pricing Engine");
let (event_tx, event_rx) = mpsc::channel::<BlockchainEvent>(100);
let listener_handle = start_blockchain_listener(cli.node_url.clone(), event_tx).await;
let config = load_operator_config(&cli.config).await?;
let benchmark_cache = init_benchmark_cache(&config).await?;
let pricing_config = init_pricing_config(
cli.pricing_config
.to_str()
.unwrap_or("config/default_pricing.toml"),
)
.await?;
let operator_signer = init_operator_signer(&config, &config.keystore_path)?;
info!("Operator signer initialized successfully");
let _event_processor = spawn_event_processor(event_rx, benchmark_cache.clone(), config.clone());
let server_handle = tokio::spawn(async move {
if let Err(e) =
run_rpc_server(config, benchmark_cache, pricing_config, operator_signer).await
{
blueprint_core::error!("gRPC server error: {}", e);
}
});
wait_for_shutdown().await;
cleanup(listener_handle).await;
server_handle.abort();
Ok(())
}
#[tokio::main]
async fn main() -> Result<()> {
let cli = Cli::parse();
run_app(cli).await
}