mod config; mod greeter; mod health; mod indexer; mod metadata; mod torrent; mod torrent_manager; mod generated { pub mod hello { include!("generated/hello/hello.rs"); } pub mod torrent { include!("generated/torrent/torrent.rs"); } pub mod torrent_manager { include!("generated/torrent_manager/torrent_manager.rs"); } pub mod metadata { include!("generated/metadata/v1/metadata.v1.rs"); } pub mod health { include!("generated/health/health.rs"); } } use std::{fs, sync::Arc}; use generated::{ health::health_server::HealthServer as AggregatorHealthServer, hello::greeter_server::GreeterServer, metadata::metadata_service_server::MetadataServiceServer, torrent::torrents_server::TorrentsServer, torrent_manager::torrent_manager_server::TorrentManagerServer, }; use greeter::GreeterService; use health::HealthService; use indexer::Jackett; use metadata::MetadataService; use tonic_health::pb::health_server::HealthServer; use torrent::TorrentsService; use torrent_manager::TorrentMananagerService; #[tokio::main] async fn main() -> Result<(), Box> { let config_str = fs::read_to_string("config.toml").expect("Failed to read file"); let config: config::Config = toml::from_str(&config_str).expect("Failed to parse TOML"); let addr = config.service.address.parse()?; let reflection = tonic_reflection::server::Builder::configure() .register_encoded_file_descriptor_set(generated::hello::FILE_DESCRIPTOR_SET) .register_encoded_file_descriptor_set(generated::torrent::FILE_DESCRIPTOR_SET) .register_encoded_file_descriptor_set(generated::health::FILE_DESCRIPTOR_SET) .register_encoded_file_descriptor_set(generated::torrent_manager::FILE_DESCRIPTOR_SET) .register_encoded_file_descriptor_set(generated::metadata::FILE_DESCRIPTOR_SET) .register_encoded_file_descriptor_set(tonic_health::pb::FILE_DESCRIPTOR_SET) .build_v1()?; let torrents = TorrentsService::new(&config.torrent.address); let metadata = MetadataService::new(&config.metadata.address); let health = HealthService::new(torrents.channel(), metadata.channel()); let indexer = Arc::new(Jackett::new(&config.indexer)); let torrent_manager = TorrentMananagerService::new(torrents.clone(), indexer); tonic::transport::Server::builder() .add_service(reflection) .add_service(HealthServer::new(health.clone())) .add_service(AggregatorHealthServer::new(health)) .add_service(GreeterServer::new(GreeterService::default())) .add_service(TorrentsServer::new(torrents)) .add_service(TorrentManagerServer::new(torrent_manager)) .add_service(MetadataServiceServer::new(metadata)) .serve(addr) .await?; return Ok(()); }