#[cfg(feature = "rest")]
use super::ServeCx;
use crate::capability::Capability;
#[derive(Debug)]
pub struct Rest;
#[async_trait::async_trait]
impl Capability for Rest {
#[cfg(feature = "rest")]
fn configured(&self, cx: &ServeCx<'_>) -> bool {
cx.app.executor().schema().rest_config.as_ref().is_some_and(|rest| rest.enabled)
}
#[cfg(feature = "rest")]
fn routes(&self, cx: &ServeCx<'_>) -> Option<axum::Router> {
use crate::routes::rest::rest_query_router;
let server = cx.server;
let authenticated = server.oidc_validator.is_some() || server.hs256_auth.is_some();
let mount = crate::routes::rest::RestMountConfig {
compression_enabled: server.config.compression_enabled,
auth_layer_attached: authenticated,
export: std::sync::Arc::new(server.config.export.clone()),
};
let rest_app = match server.rest_router_builder.as_ref() {
Some(build_with_writes) => build_with_writes(cx.app, &mount),
None => rest_query_router(cx.app, &mount),
}?;
Some(server.attach_auth(
rest_app,
crate::server::routing::AuthPosture::Authenticated,
"rest",
))
}
}