use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum RdfFormat {
RdfXml,
#[default]
JsonLd,
Turtle,
NTriples,
}
impl fmt::Display for RdfFormat {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::RdfXml => write!(f, "RDF/XML"),
Self::JsonLd => write!(f, "JSON-LD"),
Self::Turtle => write!(f, "Turtle"),
Self::NTriples => write!(f, "N-Triples"),
}
}
}
impl RdfFormat {
#[must_use]
pub const fn mime_type(&self) -> &'static str {
match self {
Self::RdfXml => "application/rdf+xml",
Self::JsonLd => "application/ld+json",
Self::Turtle => "text/turtle",
Self::NTriples => "application/n-triples",
}
}
#[must_use]
pub const fn file_extension(&self) -> &'static str {
match self {
Self::RdfXml => "rdf",
Self::JsonLd => "jsonld",
Self::Turtle => "ttl",
Self::NTriples => "nt",
}
}
}
#[derive(Debug, Clone)]
#[allow(clippy::struct_excessive_bools)]
pub struct BibframeConfig {
pub base_uri: Option<String>,
pub use_control_number: bool,
pub link_authorities: bool,
pub output_format: RdfFormat,
pub include_bflc: bool,
pub include_source: bool,
pub fail_fast: bool,
pub strict: bool,
}
impl Default for BibframeConfig {
fn default() -> Self {
Self {
base_uri: None,
use_control_number: true,
link_authorities: false,
output_format: RdfFormat::default(),
include_bflc: true,
include_source: false,
fail_fast: false,
strict: false,
}
}
}
impl BibframeConfig {
#[must_use]
pub fn new() -> Self {
Self::default()
}
#[must_use]
pub fn with_base_uri(mut self, uri: impl Into<String>) -> Self {
self.base_uri = Some(uri.into());
self
}
#[must_use]
pub const fn with_output_format(mut self, format: RdfFormat) -> Self {
self.output_format = format;
self
}
#[must_use]
pub const fn with_authority_linking(mut self, enabled: bool) -> Self {
self.link_authorities = enabled;
self
}
#[must_use]
pub const fn with_strict_mode(mut self, enabled: bool) -> Self {
self.strict = enabled;
self
}
#[must_use]
pub const fn with_fail_fast(mut self, enabled: bool) -> Self {
self.fail_fast = enabled;
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_config() {
let config = BibframeConfig::default();
assert!(config.base_uri.is_none());
assert!(config.use_control_number);
assert!(!config.link_authorities);
assert_eq!(config.output_format, RdfFormat::JsonLd);
assert!(config.include_bflc);
assert!(!config.include_source);
assert!(!config.fail_fast);
assert!(!config.strict);
}
#[test]
fn test_builder_pattern() {
let config = BibframeConfig::new()
.with_base_uri("http://example.org/")
.with_output_format(RdfFormat::Turtle)
.with_authority_linking(true)
.with_strict_mode(true);
assert_eq!(config.base_uri, Some("http://example.org/".into()));
assert_eq!(config.output_format, RdfFormat::Turtle);
assert!(config.link_authorities);
assert!(config.strict);
}
#[test]
fn test_rdf_format_display() {
assert_eq!(format!("{}", RdfFormat::RdfXml), "RDF/XML");
assert_eq!(format!("{}", RdfFormat::JsonLd), "JSON-LD");
assert_eq!(format!("{}", RdfFormat::Turtle), "Turtle");
assert_eq!(format!("{}", RdfFormat::NTriples), "N-Triples");
}
#[test]
fn test_rdf_format_mime_types() {
assert_eq!(RdfFormat::RdfXml.mime_type(), "application/rdf+xml");
assert_eq!(RdfFormat::JsonLd.mime_type(), "application/ld+json");
assert_eq!(RdfFormat::Turtle.mime_type(), "text/turtle");
assert_eq!(RdfFormat::NTriples.mime_type(), "application/n-triples");
}
#[test]
fn test_rdf_format_extensions() {
assert_eq!(RdfFormat::RdfXml.file_extension(), "rdf");
assert_eq!(RdfFormat::JsonLd.file_extension(), "jsonld");
assert_eq!(RdfFormat::Turtle.file_extension(), "ttl");
assert_eq!(RdfFormat::NTriples.file_extension(), "nt");
}
}