use super::pagination::{PaginationMetadata, PaginationParams};
use super::triple_pattern::TpfQuery;
use crate::server::AppState;
use std::sync::Arc;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ResponseTriple {
pub subject: String,
pub predicate: String,
pub object: String,
}
#[derive(Debug, Clone)]
pub struct TpfResponse {
pub query: TpfQuery,
pub triples: Vec<ResponseTriple>,
pub metadata: PaginationMetadata,
pub fragment_uri: String,
}
pub fn build_tpf_response(
query: &TpfQuery,
pagination: &PaginationParams,
_state: &Arc<AppState>,
) -> TpfResponse {
let triples: Vec<ResponseTriple> = Vec::new();
let metadata = PaginationMetadata::new(pagination, 0);
let fragment_uri = build_fragment_uri(query, pagination);
TpfResponse {
query: query.clone(),
triples,
metadata,
fragment_uri,
}
}
fn build_fragment_uri(query: &TpfQuery, pagination: &PaginationParams) -> String {
let mut parts = Vec::new();
if let Some(s) = &query.subject {
parts.push(format!(
"subject={}",
oxirs_core::encoding::percent_encode(s)
));
}
if let Some(p) = &query.predicate {
parts.push(format!(
"predicate={}",
oxirs_core::encoding::percent_encode(p)
));
}
if let Some(o) = &query.object {
parts.push(format!(
"object={}",
oxirs_core::encoding::percent_encode(o)
));
}
parts.push(format!("page={}", pagination.page));
format!("/ldf?{}", parts.join("&"))
}