Line data Source code
1 : use axum_extra::extract::cookie::Key;
2 : use clap::{Arg, Command};
3 : use std::{
4 : fs,
5 : sync::{Arc, Mutex},
6 : };
7 : use tokio::net::TcpListener;
8 :
9 0 : fn bliki_cmd() -> Command {
10 0 : Command::new("bliki")
11 0 : .about("A personal site")
12 0 : .arg(
13 0 : Arg::new("template_dir")
14 0 : .short('D')
15 0 : .default_value("templates")
16 0 : .help("The directory where templates are"),
17 : )
18 0 : .arg(
19 0 : Arg::new("dbpath")
20 0 : .short('d')
21 0 : .default_value("bliki.sqlite3")
22 0 : .help("Path to the SQLite database to use"),
23 : )
24 0 : .arg(
25 0 : Arg::new("asset_dir")
26 0 : .short('a')
27 0 : .default_value("./public")
28 0 : .help("Path to server assets (js, css, icons, etc) from"),
29 : )
30 0 : .arg(
31 0 : Arg::new("upload_dir")
32 0 : .short('U')
33 0 : .default_value("./uploads")
34 0 : .help("Directory where media uploads will be stored"),
35 : )
36 0 : .arg(
37 0 : Arg::new("host")
38 0 : .short('H')
39 0 : .default_value("0.0.0.0")
40 0 : .help("The host to serve bliki under"),
41 : )
42 0 : .arg(
43 0 : Arg::new("port").short('p').default_value("3000").help("The port to serve bliki under"),
44 : )
45 0 : .arg(Arg::new("key").short('k').help("The cookie to sign cookies with"))
46 0 : }
47 :
48 : #[tokio::main]
49 0 : async fn main() -> anyhow::Result<()> {
50 0 : let cmd = bliki_cmd();
51 0 : let args = cmd.get_matches();
52 0 : let host = args.get_one::<String>("host").unwrap();
53 0 : let port = args.get_one::<String>("port").unwrap();
54 0 : let addr = format!("{0}:{1}", host, port);
55 0 : let template_dir = args.get_one::<String>("template_dir").unwrap();
56 0 : let dbpath = args.get_one::<String>("dbpath").unwrap();
57 0 : let db = bliki::db::new(dbpath.into())?;
58 0 : let asset_dir = args.get_one::<String>("asset_dir").unwrap();
59 0 : let upload_dir = args.get_one::<String>("upload_dir").unwrap();
60 0 : let key_file = args.get_one::<String>("key").unwrap();
61 0 : let key_bytes = fs::read(key_file)?;
62 0 : let key = Key::from(key_bytes.as_slice());
63 0 : tracing_subscriber::fmt::init();
64 0 : let app = bliki::new(Arc::new(Mutex::new(db)), template_dir, asset_dir, upload_dir, key);
65 0 : let listener = TcpListener::bind(addr).await?;
66 0 : axum::serve(listener, app).await?;
67 0 : Ok(())
68 0 : }
|