Lines
94.12 %
Functions
28.95 %
use crate::server::{
dataset::{Dataset, PredicateObject},
DatasetSummary, DatasetVersionSummary,
};
use askama::Template;
use sophia::api::{term::IriRef, MownStr};
use std::collections::BTreeSet;
#[derive(Template)]
#[template(path = "index.html")]
pub(crate) struct IndexTemplate<'a> {
pub datasets: &'a [DatasetSummary<'a>],
}
#[template(path = "dataset.html")]
pub(crate) struct DatasetTemplate<'a> {
pub dataset: &'a Dataset,
pub versions: &'a [DatasetVersionSummary],
#[template(path = "version.html")]
pub(crate) struct VersionTemplate<'a> {
pub dataset: &'a DatasetSummary<'a>,
pub version: &'a DatasetVersionSummary,
pub subjects: BTreeSet<&'a IriRef<MownStr<'a>>>,
#[template(path = "subject.html")]
pub(crate) struct SubjectTemplate<'a> {
pub subject: String,
pub pos: Vec<PredicateObject<'a>>,
mod filters {
use std::fmt;
use askama::Error::Fmt;
use chrono::{DateTime, Utc};
use lazy_static::lazy_static;
use sophia::{
api::prefix::{PrefixMap, PrefixMapPair},
iri::Iri,
dataset::{load_datasets, load_prefixes, Dataset},
get_dataset_version,
static LABEL_RESOURCE: &str = "http://www.w3.org/2000/01/rdf-schema#label";
lazy_static! {
static ref DATASETS: Vec<Dataset> = load_datasets("datasets").unwrap_or_default();
static ref PREFIXES: Vec<PrefixMapPair> = load_prefixes("datasets").unwrap_or_default();
pub fn replace_prefix<T: std::fmt::Display>(s: T) -> ::askama::Result<String> {
let prefix_found = PREFIXES.get_prefixed_pair(Iri::new_unchecked(s.to_string()));
let out = if let Some(ps) = prefix_found {
format!("{}:{}", ps.0.as_str(), ps.1)
} else {
s.to_string()
Ok(out)
// Would be nice if this filter returned the found prefix in the original URL format
// pub fn prefix<T: std::fmt::Display>(s: T) -> ::askama::Result<String> {
// let prefix_found = PREFIXES.get_prefixed_pair(Iri::new_unchecked(s.to_string()));
// let out = if let Some(ps) = prefix_found {
// format!("{}", ps.0.)
// } else {
// s.to_string()
// };
// Ok(out)
// }
pub fn rdfslabel<T: std::fmt::Display>(
s: T,
id: &&str,
version: &DateTime<Utc>,
) -> ::askama::Result<String> {
let subject = Iri::new_unchecked(s.to_string());
let Ok((_, dataset_version)) = get_dataset_version(&DATASETS, id, *version) else {
return Err(Fmt(fmt::Error));
let pos = dataset_version.pos(&subject);
let find_target_po = pos
.into_iter()
.find(|po| po.predicate.as_str() == LABEL_RESOURCE);
let Some(target_po) = find_target_po else {
return Ok("".to_string());
let Some(target_object) = target_po.object_literal else {
Ok(target_object.to_string())