From 955f6e302f31db6fc41a9120731de2cb8f641254 Mon Sep 17 00:00:00 2001 From: thek4n Date: Sat, 21 Feb 2026 09:16:43 +0300 Subject: [PATCH] add arg to define root directory --- src/main.rs | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index 65c2b78..ec4afb3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -41,6 +41,10 @@ struct Args { /// Port to listen #[arg(short, long, default_value_t = 8000)] port: u16, + + /// Markdown documents directory root + #[arg(short, long)] + root: PathBuf, } @@ -49,11 +53,18 @@ struct AppState { syntax_set: Arc, theme_set: Arc, tx: Arc>, + root: PathBuf, } #[tokio::main] async fn main() { let args = Args::parse(); + + if !args.root.is_dir() { + eprintln!("Root is not a directory"); + std::process::exit(1); + } + tracing_subscriber::fmt::init(); let ss = SyntaxSet::load_defaults_newlines(); @@ -65,6 +76,7 @@ async fn main() { syntax_set: Arc::new(ss), theme_set: Arc::new(ts), tx: Arc::new(tx), + root: args.root, }; let watcher_state = state.clone(); @@ -95,8 +107,10 @@ fn resolve_addr(host: &str, port: u16) -> io::Result { .ok_or_else(|| io::Error::new(io::ErrorKind::NotFound, "Не удалось разрешить адрес")) } -async fn root() -> Result, StatusCode> { - render_directory_index(&PathBuf::from("./notes"), "").await +async fn root( + State(state): State, +) ->Result, StatusCode> { + render_directory_index(&PathBuf::from(state.root), "").await } async fn sse_handler( @@ -150,7 +164,7 @@ async fn serve_file( return Err(StatusCode::NOT_FOUND); } - let mut requested_path = PathBuf::from("./notes"); + let mut requested_path = PathBuf::from(&state.root); requested_path.push(&full_path); // Безопасность путей @@ -159,7 +173,7 @@ async fn serve_file( Err(_) => return Err(StatusCode::NOT_FOUND), }; - let base_dir = match fs::canonicalize("./notes").await { + let base_dir = match fs::canonicalize(&state.root).await { Ok(p) => p, Err(_) => return Err(StatusCode::INTERNAL_SERVER_ERROR), };