use actix_web::{
dev,
http::{header, StatusCode},
middleware::{DefaultHeaders, ErrorHandlerResponse, ErrorHandlers, Logger},
App, HttpServer, Result,
};
use env_logger::Env;
use openapi::ApiDoc;
use std::{env, net::Ipv4Addr};
use utoipa::OpenApi;
use utoipa_swagger_ui::SwaggerUi;
mod anything;
mod auth;
mod dynamic_data;
mod http_methods;
mod openapi;
const VERSION: &str = env!("CARGO_PKG_VERSION");
#[actix_web::main]
async fn main() -> std::io::Result<()> {
env_logger::init_from_env(Env::default().default_filter_or("info"));
HttpServer::new(|| {
let mut doc = ApiDoc::openapi();
doc.info.version = VERSION.to_string();
App::new()
.wrap(Logger::default()) .wrap(DefaultHeaders::new().add(("X-Version", VERSION))) .wrap(ErrorHandlers::new().handler(StatusCode::INTERNAL_SERVER_ERROR, add_error_header))
.service(SwaggerUi::new("/openapi/{_:.*}").url("/openapi.json", doc))
.configure(http_methods::api)
.configure(auth::api)
.configure(anything::api)
.configure(dynamic_data::api)
})
.bind((Ipv4Addr::UNSPECIFIED, 8080))?
.run()
.await
}
fn add_error_header<B>(mut res: dev::ServiceResponse<B>) -> Result<ErrorHandlerResponse<B>> {
res.response_mut().headers_mut().insert(
header::CONTENT_TYPE,
header::HeaderValue::from_static("ERROR"),
);
Ok(ErrorHandlerResponse::Response(res.map_into_left_body()))
}