pub mod formats;
pub mod pagination;
pub mod response;
pub mod triple_pattern;
#[cfg(test)]
mod tests;
pub use formats::{negotiate_format, serialize_response, LdfFormat};
pub use pagination::{PaginationMetadata, PaginationParams};
pub use response::{build_tpf_response, ResponseTriple, TpfResponse};
pub use triple_pattern::{parse_tpf_query, TpfQuery};
use crate::server::AppState;
use axum::{
extract::{Query, State},
http::HeaderMap,
response::IntoResponse,
};
use std::sync::Arc;
#[derive(Debug, Clone, serde::Deserialize)]
pub struct TpfQueryParams {
pub subject: Option<String>,
pub predicate: Option<String>,
pub object: Option<String>,
pub page: Option<usize>,
pub page_size: Option<usize>,
}
pub async fn ldf_handler(
State(state): State<Arc<AppState>>,
headers: HeaderMap,
Query(params): Query<TpfQueryParams>,
) -> impl IntoResponse {
let query = match parse_tpf_query(¶ms) {
Ok(q) => q,
Err(e) => return (axum::http::StatusCode::BAD_REQUEST, e).into_response(),
};
let pagination = PaginationParams::from_params(¶ms);
let response = build_tpf_response(&query, &pagination, &state);
let format = negotiate_format(&headers);
let body = serialize_response(&response, format);
(
axum::http::StatusCode::OK,
[("Content-Type", format.mime_type())],
body,
)
.into_response()
}