use std::net::{IpAddr, SocketAddr};
use std::sync::Arc;
use crate::engine::CrawlEngine;
use crate::error::CrawlError;
use crate::types::CrawlConfig;
use super::router::create_router;
pub async fn serve(host: &str, port: u16, engine: Arc<CrawlEngine>) -> Result<(), CrawlError> {
let ip: IpAddr = host
.parse()
.map_err(|e| CrawlError::InvalidConfig(format!("invalid host address: {e}")))?;
let addr = SocketAddr::new(ip, port);
let app = create_router(engine);
let listener = tokio::net::TcpListener::bind(addr)
.await
.map_err(|e| CrawlError::Other(format!("failed to bind {addr}: {e}")))?;
axum::serve(listener, app)
.await
.map_err(|e| CrawlError::Other(format!("server error: {e}")))?;
Ok(())
}
pub async fn serve_with_config(host: &str, port: u16, config: CrawlConfig) -> Result<(), CrawlError> {
let engine = CrawlEngine::builder().config(config).build()?;
serve(host, port, Arc::new(engine)).await
}