mod handlers; use crate::handlers::AppState; use axum::{ Router, routing::{get, post}, extract::DefaultBodyLimit, }; use clap::Parser; use std::{path::PathBuf, sync::Arc}; use tokio::fs; #[derive(Parser)] struct Args { #[arg(short, long, default_value_t = 3000)] port: u16, } #[tokio::main] async fn main() { let args = Args::parse(); let paste_dir = PathBuf::from("pastes"); fs::create_dir_all(&paste_dir).await.unwrap(); let state = AppState { paste_dir: Arc::new(paste_dir), }; let app = Router::new() .route("/", get(handlers::index)) .route("/", post(handlers::create_paste)) .route("/{id}", get(handlers::get_paste)) .route("/{id}/raw", get(handlers::get_paste_raw)) .layer(DefaultBodyLimit::max(1024 * 512)) .with_state(state); let addr = format!("0.0.0.0:{}", args.port); let listener = tokio::net::TcpListener::bind(&addr).await.unwrap(); println!("patissiere listening on port {}", args.port); axum::serve(listener, app).await.unwrap(); }