Files
tools/graph/src/class.rs
T

108 lines
4.3 KiB
Rust
Raw Normal View History

2026-08-20 20:43:18 -04:00
use std::collections::HashMap;
use std::fmt::Display;
use oxigraph::model::{NamedNode, NamedNodeRef};
use oxilangtag::LanguageTag;
use gl_search::Schema;
use crate::language::LanguageCondition;
2026-08-12 14:11:47 -04:00
use crate::vocab;
2026-08-20 20:43:18 -04:00
#[derive(Clone, Debug, Eq, PartialEq)]
2026-08-12 14:11:47 -04:00
pub enum Class {
RdfProperty = 0,
RdfsClass = 1,
SkosConcept = 2,
Work = 10001,
Person = 10004,
CorporateBody = 10005,
Expression = 10006,
Manifestation = 10007,
}
2026-08-20 20:43:18 -04:00
impl Display for Class {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Class::RdfProperty => f.write_str("RDF Property"),
Class::RdfsClass => f.write_str("RDFS Class"),
Class::SkosConcept => f.write_str("SKOS Concept"),
Class::Work => f.write_str("Work"),
Class::Person => f.write_str("Person"),
Class::CorporateBody => f.write_str("Corporate Body"),
Class::Expression => f.write_str("Expression"),
Class::Manifestation => f.write_str("Manifestation"),
}
}
}
2026-08-12 14:11:47 -04:00
impl Class {
2026-08-20 20:43:18 -04:00
pub const ALL: &[Class] = &[
Class::RdfProperty,
Class::RdfsClass,
Class::SkosConcept,
Class::Work,
Class::Person,
Class::CorporateBody,
Class::Expression,
Class::Manifestation,
];
2026-08-12 14:11:47 -04:00
pub fn to_named_node(&self) -> NamedNodeRef<'_> {
match self {
Class::RdfProperty => vocab::rdf::PROPERTY,
Class::RdfsClass => vocab::rdfs::CLASS,
Class::SkosConcept => vocab::skos::CONCEPT,
Class::Work => vocab::rdac::WORK,
Class::Person => vocab::rdac::PERSON,
Class::CorporateBody => vocab::rdac::CORPORATE_BODY,
Class::Expression => vocab::rdac::EXPRESSION,
Class::Manifestation => vocab::rdac::MANIFESTATION,
}
}
pub fn try_from_named_node<'a>(node: impl Into<NamedNodeRef<'a>>) -> Option<Self> {
let node = node.into();
match node {
vocab::rdf::PROPERTY => Some(Class::RdfProperty),
vocab::rdfs::CLASS => Some(Class::RdfsClass),
vocab::skos::CONCEPT => Some(Class::SkosConcept),
vocab::rdac::WORK => Some(Class::Work),
vocab::rdac::PERSON => Some(Class::Person),
vocab::rdac::CORPORATE_BODY => Some(Class::CorporateBody),
vocab::rdac::EXPRESSION => Some(Class::Expression),
vocab::rdac::MANIFESTATION => Some(Class::Manifestation),
_ => None,
}
}
2026-08-20 20:43:18 -04:00
2026-08-24 21:44:23 -04:00
pub fn fields(&self, language: LanguageTag<String>) -> Vec<(gl_search::Field, String)> {
2026-08-20 20:43:18 -04:00
match self {
Class::RdfProperty => vec![
(Schema::field("label", Some(language.primary_language())), String::from("Label")),
(Schema::field("definition", Some(language.primary_language())), String::from("Definition")),
],
Class::RdfsClass => vec![
(Schema::field("label", Some(language.primary_language())), String::from("Label")),
(Schema::field("definition", Some(language.primary_language())), String::from("Definition")),
],
Class::SkosConcept => vec![
(Schema::field("label", Some(language.primary_language())), String::from("Label")),
(Schema::field("definition", Some(language.primary_language())), String::from("Definition")),
],
Class::Work => vec![
(Schema::field("title", Some(language.primary_language())), String::from("Title")),
],
Class::Person => vec![
(Schema::field("given_name", Some(language.primary_language())), String::from("Given Name")),
(Schema::field("surname", Some(language.primary_language())), String::from("Surname")),
],
Class::CorporateBody => vec![
(Schema::field("corporate_body", Some(language.primary_language())), String::from("Corporate Body")),
],
Class::Expression => vec![
(Schema::field("title", Some(language.primary_language())), String::from("Title")),
],
Class::Manifestation => vec![
(Schema::field("title", Some(language.primary_language())), String::from("Title")),
],
}
}
2026-08-12 14:11:47 -04:00
}