use std::{env, sync::Arc}; use actix_web::{ get, post, web::{self, Data}, App, HttpRequest, HttpResponse, HttpServer, Responder, }; use anyhow::Error; use owo_colors::OwoColorize; use serde_json::json; use crate::handlers::handle; #[get("/")] async fn index(_req: HttpRequest) -> HttpResponse { HttpResponse::Ok().json(json!({ "server": "Rocksky Tracklist Server", "version": "0.1.0", })) } #[post("/{method}")] async fn call_method( data: web::Data>, mut payload: web::Payload, req: HttpRequest, ) -> Result { let method = req.match_info().get("method").unwrap_or("unknown"); println!("Method: {}", method.bright_green()); let conn = data.get_ref().clone(); handle(method, &mut payload, &req, conn) .await .map_err(actix_web::error::ErrorInternalServerError) } pub async fn run() -> Result<(), Error> { let host = env::var("TRACKLIST_HOST").unwrap_or_else(|_| "127.0.0.1".to_string()); let port = env::var("TRACKLIST_PORT").unwrap_or_else(|_| "7884".to_string()); let addr = format!("{}:{}", host, port); let url = format!("http://{}", addr); println!("Listening on {}", url.bright_green()); let client = redis::Client::open(env::var("REDIS_URL").unwrap_or("redis://127.0.0.1".into()))?; let conn = Arc::new(client); HttpServer::new(move || { App::new() .app_data(Data::new(conn.clone())) .service(index) .service(call_method) }) .bind(&addr)? .run() .await .map_err(Error::new)?; Ok(()) }