| 122 | |
| 123 | #[tokio::main] |
| 124 | async fn start() -> std::io::Result<()> { |
| 125 | std::env::set_var("RUST_LOG", "debug"); |
| 126 | tracing_subscriber::fmt::init(); |
| 127 | |
| 128 | // get env vars |
| 129 | dotenvy::dotenv().ok(); |
| 130 | let db_url = env::var("DATABASE_URL").expect("DATABASE_URL is not set in .env file"); |
| 131 | let host = env::var("HOST").expect("HOST is not set in .env file"); |
| 132 | let port = env::var("PORT").expect("PORT is not set in .env file"); |
| 133 | let server_url = format!("{host}:{port}"); |
| 134 | |
| 135 | // create post table if not exists |
| 136 | let conn = Database::connect(&db_url).await.unwrap(); |
| 137 | Migrator::up(&conn, None).await.unwrap(); |
| 138 | let templates = Tera::new(concat!(env!("CARGO_MANIFEST_DIR"), "/templates/**/*")).unwrap(); |
| 139 | let state = AppState { templates, conn }; |
| 140 | |
| 141 | println!("Starting server at {server_url}"); |
| 142 | |
| 143 | let app = Route::new() |
| 144 | .at("/", post(create).get(list)) |
| 145 | .at("/new", new) |
| 146 | .at("/:id", get(edit).post(update)) |
| 147 | .at("/delete/:id", post(delete)) |
| 148 | .nest( |
| 149 | "/static", |
| 150 | StaticFilesEndpoint::new(concat!(env!("CARGO_MANIFEST_DIR"), "/static")), |
| 151 | ) |
| 152 | .data(state); |
| 153 | let server = Server::new(TcpListener::bind(format!("{host}:{port}"))); |
| 154 | server.run(app).await |
| 155 | } |
| 156 | |
| 157 | pub fn main() { |
| 158 | let result = start(); |