add arg to define root directory

This commit is contained in:
thek4n 2026-02-21 09:16:43 +03:00
parent 45a8c4ea08
commit 955f6e302f

View File

@ -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<SyntaxSet>,
theme_set: Arc<ThemeSet>,
tx: Arc<broadcast::Sender<String>>,
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<SocketAddr> {
.ok_or_else(|| io::Error::new(io::ErrorKind::NotFound, "Не удалось разрешить адрес"))
}
async fn root() -> Result<Html<String>, StatusCode> {
render_directory_index(&PathBuf::from("./notes"), "").await
async fn root(
State(state): State<AppState>,
) ->Result<Html<String>, 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),
};