summaryrefslogtreecommitdiff
path: root/dichroism/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'dichroism/src/main.rs')
-rw-r--r--dichroism/src/main.rs99
1 files changed, 38 insertions, 61 deletions
diff --git a/dichroism/src/main.rs b/dichroism/src/main.rs
index 6c76f0a..86de76f 100644
--- a/dichroism/src/main.rs
+++ b/dichroism/src/main.rs
@@ -1,66 +1,43 @@
-#[macro_use]
-extern crate serde;
-#[macro_use]
-extern crate diesel;
-
-use actix_cors::Cors;
-use actix_web::{middleware::Logger, App, HttpServer};
-use config::CONFIG_INSTANCE as CONFIG;
-use diesel::prelude::SqliteConnection;
-use diesel::r2d2::ConnectionManager;
-use diesel::r2d2::Pool;
-use listenfd::ListenFd;
-use result::Result;
+use anyhow::Context;
+use axum::{http::StatusCode, routing::get_service, Router};
+use r2d2::Pool;
+use r2d2_sqlite::SqliteConnectionManager;
+use rusqlite::params;
+use std::io::Error;
+use tower_http::services::ServeDir;
mod config;
-mod constants;
-mod dtos;
-mod error;
-mod handlers;
-mod image_service;
-mod models;
-mod repo;
mod result;
-mod schema;
-mod types;
-
-#[actix_web::main]
-async fn main() -> Result<()> {
- // Init logging
- std::env::set_var("RUST_LOG", "actix_web=info");
- env_logger::init();
-
- // Init DB connection pool
- let manager = ConnectionManager::<SqliteConnection>::new(&CONFIG.db_url);
- let pool = Pool::builder().build(manager)?;
-
- // Init application server
- let mut server = HttpServer::new(move || {
- // Init CORS policy
- let cors = Cors::permissive();
-
- App::new()
- .data(pool.clone())
- .wrap(cors)
- .wrap(Logger::default())
- .service(handlers::hello)
- .service(handlers::get_products)
- .service(handlers::patch_product)
- .service(handlers::post_product)
- .service(handlers::post_photo)
- });
-
- // If using listenfd, bind to it instead of the configured address to allow for cargo watch
- // auto-reloading
- let mut listenfd = ListenFd::from_env();
- server = if let Some(l) = listenfd
- .take_tcp_listener(0)
- .expect("Unable to grab TCP listener!")
- {
- server.listen(l)?
- } else {
- server.bind(CONFIG.bind_addr)?
- };
- Ok(server.run().await?)
+#[tokio::main]
+async fn main() -> result::Result<()> {
+ // read config from environment
+ let config = config::Config::from_env()?;
+
+ // start db connection pool
+ let manager = SqliteConnectionManager::file(&config.db_path);
+ let pool = Pool::new(manager).with_context(|| "Failed to create database connection pool.")?;
+
+ // migrate/init db if empty
+ pool.get()?
+ .execute(include_str!("./migrations/photo_sets.sql"), params![])?;
+ pool.get()?
+ .execute(include_str!("./migrations/products.sql"), params![])?;
+
+ let app = Router::new().nest(
+ "/static",
+ get_service(ServeDir::new("/zroot/gl/images")).handle_error(|error: Error| async move {
+ (
+ StatusCode::INTERNAL_SERVER_ERROR,
+ format!("Unhandled internal error: {}", error),
+ )
+ }),
+ );
+
+ axum::Server::bind(&config.bind_addr)
+ .serve(app.into_make_service())
+ .await
+ .with_context(|| "Server error!")?;
+
+ Ok(())
}