mod api; use rocket::{fairing, fairing::AdHoc, Build, Rocket}; use rocket_db_pools::{sqlx, Database}; use rocket_okapi::{ mount_endpoints_and_merged_docs, openapi, rapidoc::*, settings::{OpenApiSettings, UrlObject}, swagger_ui::{make_swagger_ui, SwaggerUIConfig}, }; #[macro_use] extern crate rocket; #[derive(Database)] #[database("party")] pub struct Db(sqlx::SqlitePool); #[openapi] #[get("/")] fn index() -> String { format!("Hello, world!") } async fn run_migrations(rocket: Rocket) -> fairing::Result { match Db::fetch(&rocket) { Some(db) => match sqlx::migrate!("db/migrations").run(&**db).await { Ok(_) => { println!("Migrations completed"); Ok(rocket) } Err(e) => { error!("Failed to initialize SQLx database: {}", e); Err(rocket) } }, None => Err(rocket), } } #[launch] fn rocket() -> _ { let building_rocket = rocket::build() .attach(Db::init()) .attach(AdHoc::try_on_ignite("SQLx Migrations", run_migrations)) .mount("/", routes![index]) .mount( "/swagger", make_swagger_ui(&SwaggerUIConfig { url: "../api/openapi.json".to_owned(), ..Default::default() }), ) .mount( "/rapidoc/", make_rapidoc(&RapiDocConfig { general: GeneralConfig { spec_urls: vec![UrlObject::new("General", "../api/openapi.json")], ..Default::default() }, hide_show: HideShowConfig { allow_spec_url_load: false, allow_spec_file_load: false, ..Default::default() }, ..Default::default() }), ); let openapi_settings = OpenApiSettings::default(); api::mount_endpoints(building_rocket, &openapi_settings) }