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
|
/// Port to listen
|
||||||
#[arg(short, long, default_value_t = 8000)]
|
#[arg(short, long, default_value_t = 8000)]
|
||||||
port: u16,
|
port: u16,
|
||||||
|
|
||||||
|
/// Markdown documents directory root
|
||||||
|
#[arg(short, long)]
|
||||||
|
root: PathBuf,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -49,11 +53,18 @@ struct AppState {
|
|||||||
syntax_set: Arc<SyntaxSet>,
|
syntax_set: Arc<SyntaxSet>,
|
||||||
theme_set: Arc<ThemeSet>,
|
theme_set: Arc<ThemeSet>,
|
||||||
tx: Arc<broadcast::Sender<String>>,
|
tx: Arc<broadcast::Sender<String>>,
|
||||||
|
root: PathBuf,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() {
|
async fn main() {
|
||||||
let args = Args::parse();
|
let args = Args::parse();
|
||||||
|
|
||||||
|
if !args.root.is_dir() {
|
||||||
|
eprintln!("Root is not a directory");
|
||||||
|
std::process::exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
tracing_subscriber::fmt::init();
|
tracing_subscriber::fmt::init();
|
||||||
|
|
||||||
let ss = SyntaxSet::load_defaults_newlines();
|
let ss = SyntaxSet::load_defaults_newlines();
|
||||||
@ -65,6 +76,7 @@ async fn main() {
|
|||||||
syntax_set: Arc::new(ss),
|
syntax_set: Arc::new(ss),
|
||||||
theme_set: Arc::new(ts),
|
theme_set: Arc::new(ts),
|
||||||
tx: Arc::new(tx),
|
tx: Arc::new(tx),
|
||||||
|
root: args.root,
|
||||||
};
|
};
|
||||||
|
|
||||||
let watcher_state = state.clone();
|
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, "Не удалось разрешить адрес"))
|
.ok_or_else(|| io::Error::new(io::ErrorKind::NotFound, "Не удалось разрешить адрес"))
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn root() -> Result<Html<String>, StatusCode> {
|
async fn root(
|
||||||
render_directory_index(&PathBuf::from("./notes"), "").await
|
State(state): State<AppState>,
|
||||||
|
) ->Result<Html<String>, StatusCode> {
|
||||||
|
render_directory_index(&PathBuf::from(state.root), "").await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn sse_handler(
|
async fn sse_handler(
|
||||||
@ -150,7 +164,7 @@ async fn serve_file(
|
|||||||
return Err(StatusCode::NOT_FOUND);
|
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);
|
requested_path.push(&full_path);
|
||||||
|
|
||||||
// Безопасность путей
|
// Безопасность путей
|
||||||
@ -159,7 +173,7 @@ async fn serve_file(
|
|||||||
Err(_) => return Err(StatusCode::NOT_FOUND),
|
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,
|
Ok(p) => p,
|
||||||
Err(_) => return Err(StatusCode::INTERNAL_SERVER_ERROR),
|
Err(_) => return Err(StatusCode::INTERNAL_SERVER_ERROR),
|
||||||
};
|
};
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user