#![warn(
unknown_lints,
// ---------- Stylistic
absolute_paths_not_starting_with_crate,
elided_lifetimes_in_paths,
explicit_outlives_requirements,
macro_use_extern_crate,
nonstandard_style, /* group */
noop_method_call,
rust_2018_idioms,
single_use_lifetimes,
trivial_casts,
trivial_numeric_casts,
// ---------- Future
future_incompatible, /* group */
rust_2021_compatibility, /* group */
// ---------- Public
missing_debug_implementations,
// missing_docs,
unreachable_pub,
// ---------- Unsafe
unsafe_code,
unsafe_op_in_unsafe_fn,
// ---------- Unused
unused, /* group */
)]
#![deny(
// ---------- Public
exported_private_dependencies,
private_in_public,
// ---------- Deprecated
anonymous_parameters,
bare_trait_objects,
ellipsis_inclusive_range_patterns,
// ---------- Unsafe
deref_nullptr,
drop_bounds,
dyn_drop,
)]
use codes_common::code_impl;
use std::str::FromStr;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
pub enum Agency {
GS1,
IANA,
IEEE,
IETF,
ISO,
UN,
}
pub const ALL_CODES: [Agency; 4] = [Agency::IANA, Agency::IEEE, Agency::IETF, Agency::ISO];
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
pub struct Standard {
agency: Agency,
short_ref: &'static str,
long_ref: Option<&'static str>,
title: &'static str,
url: &'static str,
}
pub trait Standardized {
fn defining_standard() -> &'static Standard;
}
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
pub enum AgencyError {
FromStr(String),
}
impl FromStr for Agency {
type Err = AgencyError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"GS1" => Ok(Self::GS1),
"IANA" => Ok(Self::IANA),
"IEEE" => Ok(Self::IEEE),
"IETF" => Ok(Self::IETF),
"ISO" => Ok(Self::ISO),
"UN" => Ok(Self::UN),
_ => Err(AgencyError::FromStr(s.to_string())),
}
}
}
code_impl!(Agency, short_name);
impl Agency {
pub const fn short_name(&self) -> &'static str {
match self {
Self::GS1 => "GS1",
Self::IANA => "IANA",
Self::IEEE => "IEEE",
Self::IETF => "IETF",
Self::ISO => "ISO",
Self::UN => "UN",
}
}
pub const fn name(&self) -> &'static str {
match self {
Self::GS1 => "GS1 AISBL",
Self::IANA => "Internet Assigned Numbers Authority",
Self::IEEE => "IEEE",
Self::IETF => "The Internet Engineering Task Force",
Self::ISO => "International Organization for Standardization",
Self::UN => "The United Nations",
}
}
pub const fn url(&self) -> &'static str {
match self {
Self::GS1 => "https://www.gs1.org",
Self::IANA => "https://www.iana.org",
Self::IEEE => "https://www.ieee.org",
Self::IETF => "https://www.ietf.org",
Self::ISO => "https://www.iso.org",
Self::UN => "https://www.un.org",
}
}
pub const fn parent_agency(&self) -> Option<&Self> {
None
}
pub fn agency_urn(&self) -> String {
let mut path = vec![self.short_name().to_lowercase()];
let agency = self;
while let Some(agency) = agency.parent_agency() {
path.insert(0, agency.short_name().to_lowercase());
}
format!("urn:agency:{}", path.join("/"))
}
}
impl Standard {
pub const fn new(
agency: Agency,
short_ref: &'static str,
title: &'static str,
url: &'static str,
) -> Self {
Self {
agency,
short_ref,
long_ref: None,
title,
url,
}
}
pub const fn new_with_long_ref(
agency: Agency,
short_ref: &'static str,
long_ref: &'static str,
title: &'static str,
url: &'static str,
) -> Self {
Self {
agency,
short_ref,
long_ref: Some(long_ref),
title,
url,
}
}
pub const fn agency(&self) -> Agency {
self.agency
}
pub const fn short_ref(&self) -> &'static str {
self.short_ref
}
pub const fn long_ref(&self) -> Option<&&'static str> {
self.long_ref.as_ref()
}
pub const fn title(&self) -> &'static str {
self.title
}
pub const fn url(&self) -> &'static str {
self.url
}
}
impl std::fmt::Display for AgencyError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}",
match self {
Self::FromStr(s) => format!("The short name {:?} is not a known agency", s),
}
)
}
}
impl std::error::Error for AgencyError {}