use futures::FutureExt;
use http::Response;
use hyper::Body;
use tracing::warn;
use warp::{
filters::BoxedFilter,
http::StatusCode,
reject::Rejection,
reply::{self, Reply},
Filter,
};
use super::{rpcs::info::GetStatusResult, ReactorEventT};
use crate::{
effect::{requests::ApiRequest, EffectBuilder},
reactor::QueueKind,
};
pub const STATUS_API_PATH: &str = "status";
pub const METRICS_API_PATH: &str = "metrics";
pub(super) fn create_status_filter<REv: ReactorEventT>(
effect_builder: EffectBuilder<REv>,
) -> BoxedFilter<(Response<Body>,)> {
warp::get()
.and(warp::path(STATUS_API_PATH))
.and_then(move || {
effect_builder
.make_request(
|responder| ApiRequest::GetStatus { responder },
QueueKind::Api,
)
.map(|status_feed| {
let body = GetStatusResult::from(status_feed);
Ok::<_, Rejection>(reply::json(&body).into_response())
})
})
.boxed()
}
pub(super) fn create_metrics_filter<REv: ReactorEventT>(
effect_builder: EffectBuilder<REv>,
) -> BoxedFilter<(Response<Body>,)> {
warp::get()
.and(warp::path(METRICS_API_PATH))
.and_then(move || {
effect_builder
.make_request(
|responder| ApiRequest::GetMetrics { responder },
QueueKind::Api,
)
.map(|maybe_metrics| match maybe_metrics {
Some(metrics) => Ok::<_, Rejection>(
reply::with_status(metrics, StatusCode::OK).into_response(),
),
None => {
warn!("metrics not available");
Ok(reply::with_status(
"metrics not available",
StatusCode::INTERNAL_SERVER_ERROR,
)
.into_response())
}
})
})
.boxed()
}