#[cfg(feature = "api-poem")]
use {
poem::{
listener::TcpListener,
middleware::{TokioMetrics, Tracing, AddData},
EndpointExt,
},
};
use crate::service::{NorthServiceBuilder, NorthService};
use north_common::utils::logger_utils::init_logger;
use north_derives::process_poem;
pub struct North {
pub(crate) service: NorthService,
}
#[cfg(feature = "api-poem")]
pub fn new_service<T>() -> NorthServiceBuilder<T> where T: poem_openapi::OpenApi + Clone + 'static
{
init_logger();
NorthServiceBuilder::default()
}
pub fn power(service: NorthService) -> North {
init_logger();
North {
service,
}
}
impl North {
#[cfg(all(feature = "api-native", not(feature = "api-poem")))]
pub async fn up(self) -> std::io::Result<()> {
crate::server::start_server(&self.service.options).await.unwrap();
Ok(())
}
pub async fn up(self) -> std::io::Result<()> {
let full_addr = format!(
"{}:{}",
self.service.options.address.clone().unwrap(),
self.service.options.port.unwrap(),
);
let main_metrics = TokioMetrics::new();
let app = self.service.poem_app;
let end = app.at("/metrics/default", main_metrics.exporter()).with(Tracing);
let state = self.service.state_data_list.as_slice();
let d = [..state];
poem::Server::new(TcpListener::bind(full_addr))
.run(process_poem!(end, ["2", "5"]))
.await
}
}