add arg to define root directory
This commit is contained in:
parent
45a8c4ea08
commit
955f6e302f
22
src/main.rs
22
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<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),
|
||||
};
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user