use std::time::Duration;
use async_trait::async_trait;
use tap_http::event::{EventLoggerConfig, HandleEvent, HttpEvent, LogDestination};
use tap_http::{TapHttpConfig, TapHttpServer};
use tap_node::{NodeConfig, TapNode};
use tokio::time::sleep;
use tracing::{info, Level};
struct ConsoleEventSubscriber;
#[async_trait]
impl HandleEvent<'_> for ConsoleEventSubscriber {
async fn handle_event_async(&self, event: HttpEvent) {
info!("Custom event subscriber received event: {:?}", event);
}
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init();
info!("Starting TAP HTTP server with event logging");
let node = TapNode::new(NodeConfig::default());
let config = TapHttpConfig {
event_logger: Some(EventLoggerConfig {
destination: LogDestination::File {
path: "./logs/tap-http.log".to_string(),
max_size: Some(10 * 1024 * 1024), rotate: true,
},
structured: true, log_level: Level::INFO,
}),
..Default::default()
};
let mut server = TapHttpServer::new(config, node);
let custom_subscriber = ConsoleEventSubscriber;
server.event_bus().subscribe(custom_subscriber);
server.start().await?;
info!("Server started. Events are being logged to ./logs/tap-http.log");
info!("Press Ctrl+C to stop the server...");
match tokio::signal::ctrl_c().await {
Ok(()) => {
info!("Shutting down server...");
}
Err(err) => {
eprintln!("Unable to listen for shutdown signal: {}", err);
}
}
server.stop().await?;
sleep(Duration::from_millis(100)).await;
info!("Server stopped. Event logging demo completed.");
Ok(())
}