#![allow(missing_docs)]
#![allow(clippy::missing_docs_in_private_items)]
dataset_enum! {
pub enum Unit {
Mass => "Mass",
Volume => "Volume",
Length => "Length",
Time => "Time",
Angle => "Angle",
Temperature => "Temperature",
Energy => "Energy",
}
}
dataset_enum! {
pub enum TaxonomicRank {
Domain => "Domain",
Kingdom => "Kingdom",
Phylum => "Phylum",
Class => "Class",
Order => "Order",
Family => "Family",
Genus => "Genus",
Species => "Species",
}
}
dataset_enum! {
pub enum PrefixLarge {
Deca = 1 => "Deca",
Hecto = 2 => "Hecto",
Kilo = 3 => "Kilo",
Mega = 6 => "Mega",
Giga = 9 => "Giga",
Tera = 12 => "Tera",
Peta = 15 => "Peta",
Exa = 18 => "Exa",
Zetta = 21 => "Zetta",
Yotta = 24 => "Yotta",
Ronna = 27 => "Ronna",
Quetta = 30 => "Quetta",
}
}
dataset_enum! {
pub enum PrefixSmall {
Deci = 1 => "Deci",
Centi = 2 => "Centi",
Milli = 3 => "Milli",
Micro = 6 => "Micro",
Nano = 9 => "Nano",
Pico = 12 => "Pico",
Femto = 15 => "Femto",
Atto = 18 => "Atto",
Zepto = 21 => "Zepto",
Yocto = 24 => "Yocto",
Ronto = 27 => "Ronto",
Quecto = 30 => "Quecto",
}
}
dataset_enum! {
pub enum Planet {
Mercury = 1 => "Mercury",
Venus = 2 => "Venus",
Earth = 3 => "Earth",
Mars = 4 => "Mars",
Jupiter = 5 => "Jupiter",
Saturn = 6 => "Saturn",
Uranus = 7 => "Uranus",
Neptune = 8 => "Neptune",
}
}
dataset_enum! {
#[allow(missing_docs)]
pub enum Element {
Hydrogen = 1 => "Hydrogen",
Helium = 2 => "Helium",
Lithium = 3 => "Lithium",
Beryllium = 4 => "Beryllium",
Boron = 5 => "Boron",
Carbon = 6 => "Carbon",
Nitrogen = 7 => "Nitrogen",
Oxygen = 8 => "Oxygen",
Fluorine = 9 => "Fluorine",
Neon = 10 => "Neon",
Sodium = 11 => "Sodium",
Magnesium = 12 => "Magnesium",
Aluminum = 13 => "Aluminum",
Silicon = 14 => "Silicon",
Phosphorus = 15 => "Phosphorus",
Sulfur = 16 => "Sulfur",
Chlorine = 17 => "Chlorine",
Argon = 18 => "Argon",
Potassium = 19 => "Potassium",
Calcium = 20 => "Calcium",
Scandium = 21 => "Scandium",
Titanium = 22 => "Titanium",
Vanadium = 23 => "Vanadium",
Chromium = 24 => "Chromium",
Manganese = 25 => "Manganese",
Iron = 26 => "Iron",
Cobalt = 27 => "Cobalt",
Nickel = 28 => "Nickel",
Copper = 29 => "Copper",
Zinc = 30 => "Zinc",
Gallium = 31 => "Gallium",
Germanium = 32 => "Germanium",
Arsenic = 33 => "Arsenic",
Selenium = 34 => "Selenium",
Bromine = 35 => "Bromine",
Krypton = 36 => "Krypton",
Rubidium = 37 => "Rubidium",
Strontium = 38 => "Strontium",
Yttrium = 39 => "Yttrium",
Zirconium = 40 => "Zirconium",
Niobium = 41 => "Niobium",
Molybdenum = 42 => "Molybdenum",
Technetium = 43 => "Technetium",
Ruthenium = 44 => "Ruthenium",
Rhodium = 45 => "Rhodium",
Palladium = 46 => "Palladium",
Silver = 47 => "Silver",
Cadmium = 48 => "Cadmium",
Indium = 49 => "Indium",
Tin = 50 => "Tin",
Antimony = 51 => "Antimony",
Tellurium = 52 => "Tellurium",
Iodine = 53 => "Iodine",
Xenon = 54 => "Xenon",
Cesium = 55 => "Cesium",
Barium = 56 => "Barium",
Lanthanum = 57 => "Lanthanum",
Cerium = 58 => "Cerium",
Praseodymium = 59 => "Praseodymium",
Neodymium = 60 => "Neodymium",
Promethium = 61 => "Promethium",
Samarium = 62 => "Samarium",
Europium = 63 => "Europium",
Gadolinium = 64 => "Gadolinium",
Terbium = 65 => "Terbium",
Dysprosium = 66 => "Dysprosium",
Holmium = 67 => "Holmium",
Erbium = 68 => "Erbium",
Thulium = 69 => "Thulium",
Ytterbium = 70 => "Ytterbium",
Lutetium = 71 => "Lutetium",
Hafnium = 72 => "Hafnium",
Tantalum = 73 => "Tantalum",
Wolfram = 74 => "Wolfram",
Rhenium = 75 => "Rhenium",
Osmium = 76 => "Osmium",
Iridium = 77 => "Iridium",
Platinum = 78 => "Platinum",
Gold = 79 => "Gold",
Mercury = 80 => "Mercury",
Thallium = 81 => "Thallium",
Lead = 82 => "Lead",
Bismuth = 83 => "Bismuth",
Polonium = 84 => "Polonium",
Astatine = 85 => "Astatine",
Radon = 86 => "Radon",
Francium = 87 => "Francium",
Radium = 88 => "Radium",
Actinium = 89 => "Actinium",
Thorium = 90 => "Thorium",
Protactinium = 91 => "Protactinium",
Uranium = 92 => "Uranium",
Neptunium = 93 => "Neptunium",
Plutonium = 94 => "Plutonium",
Americium = 95 => "Americium",
Curium = 96 => "Curium",
Berkelium = 97 => "Berkelium",
Californium = 98 => "Californium",
Einsteinium = 99 => "Einsteinium",
Fermium = 100 => "Fermium",
Mendelevium = 101 => "Mendelevium",
Nobelium = 102 => "Nobelium",
Lawrencium = 103 => "Lawrencium",
Rutherfordium = 104 => "Rutherfordium",
Dubnium = 105 => "Dubnium",
Seaborgium = 106 => "Seaborgium",
Bohrium = 107 => "Bohrium",
Hassium = 108 => "Hassium",
Meitnerium = 109 => "Meitnerium",
Darmstadtium = 110 => "Darmstadtium",
Roentgenium = 111 => "Roentgenium",
Copernicium = 112 => "Copernicium",
Nihonium = 113 => "Nihonium",
Flerovium = 114 => "Flerovium",
Moscovium = 115 => "Moscovium",
Livermorium = 116 => "Livermorium",
Tennessine = 117 => "Tennessine",
Oganesson = 118 => "Oganesson",
}
}
impl Element {
#[must_use]
pub const fn atomic_number(self) -> u8 {
self as u8
}
#[must_use]
#[allow(clippy::too_many_lines)] pub const fn symbol(self) -> &'static str {
match self {
Self::Hydrogen => "H",
Self::Helium => "He",
Self::Lithium => "Li",
Self::Beryllium => "Be",
Self::Boron => "B",
Self::Carbon => "C",
Self::Nitrogen => "N",
Self::Oxygen => "O",
Self::Fluorine => "F",
Self::Neon => "Ne",
Self::Sodium => "Na",
Self::Magnesium => "Mg",
Self::Aluminum => "Al",
Self::Silicon => "Si",
Self::Phosphorus => "P",
Self::Sulfur => "S",
Self::Chlorine => "Cl",
Self::Argon => "Ar",
Self::Potassium => "K",
Self::Calcium => "Ca",
Self::Scandium => "Sc",
Self::Titanium => "Ti",
Self::Vanadium => "V",
Self::Chromium => "Cr",
Self::Manganese => "Mn",
Self::Iron => "Fe",
Self::Cobalt => "Co",
Self::Nickel => "Ni",
Self::Copper => "Cu",
Self::Zinc => "Zn",
Self::Gallium => "Ga",
Self::Germanium => "Ge",
Self::Arsenic => "As",
Self::Selenium => "Se",
Self::Bromine => "Br",
Self::Krypton => "Kr",
Self::Rubidium => "Rb",
Self::Strontium => "Sr",
Self::Yttrium => "Y",
Self::Zirconium => "Zr",
Self::Niobium => "Nb",
Self::Molybdenum => "Mo",
Self::Technetium => "Tc",
Self::Ruthenium => "Ru",
Self::Rhodium => "Rh",
Self::Palladium => "Pd",
Self::Silver => "Ag",
Self::Cadmium => "Cd",
Self::Indium => "In",
Self::Tin => "Sn",
Self::Antimony => "Sb",
Self::Tellurium => "Te",
Self::Iodine => "I",
Self::Xenon => "Xe",
Self::Cesium => "Cs",
Self::Barium => "Ba",
Self::Lanthanum => "La",
Self::Cerium => "Ce",
Self::Praseodymium => "Pr",
Self::Neodymium => "Nd",
Self::Promethium => "Pm",
Self::Samarium => "Sm",
Self::Europium => "Eu",
Self::Gadolinium => "Gd",
Self::Terbium => "Tb",
Self::Dysprosium => "Dy",
Self::Holmium => "Ho",
Self::Erbium => "Er",
Self::Thulium => "Tm",
Self::Ytterbium => "Yb",
Self::Lutetium => "Lu",
Self::Hafnium => "Hf",
Self::Tantalum => "Ta",
Self::Wolfram => "W",
Self::Rhenium => "Re",
Self::Osmium => "Os",
Self::Iridium => "Ir",
Self::Platinum => "Pt",
Self::Gold => "Au",
Self::Mercury => "Hg",
Self::Thallium => "Tl",
Self::Lead => "Pb",
Self::Bismuth => "Bi",
Self::Polonium => "Po",
Self::Astatine => "At",
Self::Radon => "Rn",
Self::Francium => "Fr",
Self::Radium => "Ra",
Self::Actinium => "Ac",
Self::Thorium => "Th",
Self::Protactinium => "Pa",
Self::Uranium => "U",
Self::Neptunium => "Np",
Self::Plutonium => "Pu",
Self::Americium => "Am",
Self::Curium => "Cm",
Self::Berkelium => "Bk",
Self::Californium => "Cf",
Self::Einsteinium => "Es",
Self::Fermium => "Fm",
Self::Mendelevium => "Md",
Self::Nobelium => "No",
Self::Lawrencium => "Lr",
Self::Rutherfordium => "Rf",
Self::Dubnium => "Db",
Self::Seaborgium => "Sg",
Self::Bohrium => "Bh",
Self::Hassium => "Hs",
Self::Meitnerium => "Mt",
Self::Darmstadtium => "Ds",
Self::Roentgenium => "Rg",
Self::Copernicium => "Cn",
Self::Nihonium => "Nh",
Self::Flerovium => "Fl",
Self::Moscovium => "Mc",
Self::Livermorium => "Lv",
Self::Tennessine => "Ts",
Self::Oganesson => "Og",
}
}
}
impl PrefixLarge {
#[must_use]
pub const fn exponent(self) -> i8 {
self as i8
}
#[must_use]
pub const fn symbol(self) -> &'static str {
match self {
Self::Deca => "da",
Self::Hecto => "h",
Self::Kilo => "k",
Self::Mega => "M",
Self::Giga => "G",
Self::Tera => "T",
Self::Peta => "P",
Self::Exa => "E",
Self::Zetta => "Z",
Self::Yotta => "Y",
Self::Ronna => "R",
Self::Quetta => "Q",
}
}
}
impl PrefixSmall {
#[must_use]
pub const fn exponent(self) -> i8 {
-(self as i8)
}
#[must_use]
pub const fn symbol(self) -> &'static str {
match self {
Self::Deci => "d",
Self::Centi => "c",
Self::Milli => "m",
Self::Micro => "µ",
Self::Nano => "n",
Self::Pico => "p",
Self::Femto => "f",
Self::Atto => "a",
Self::Zepto => "z",
Self::Yocto => "y",
Self::Ronto => "r",
Self::Quecto => "q",
}
}
}
impl Unit {
#[must_use]
pub const fn si_unit_symbol(self) -> &'static str {
match self {
Self::Mass => "kg",
Self::Volume => "m³",
Self::Length => "m",
Self::Time => "s",
Self::Angle => "rad",
Self::Temperature => "K",
Self::Energy => "J",
}
}
}
impl TaxonomicRank {
#[must_use]
pub const fn broader(self) -> Option<Self> {
match self {
Self::Domain => None,
Self::Kingdom => Some(Self::Domain),
Self::Phylum => Some(Self::Kingdom),
Self::Class => Some(Self::Phylum),
Self::Order => Some(Self::Class),
Self::Family => Some(Self::Order),
Self::Genus => Some(Self::Family),
Self::Species => Some(Self::Genus),
}
}
}
impl Planet {
#[must_use]
pub const fn orbital_order(self) -> u8 {
self as u8
}
}
checked_u8_enum!(Element, atomic_number);
checked_u8_enum!(Planet, orbital_order);
impl Element {
#[must_use]
pub fn from_symbol(code: &str) -> Option<Self> {
Self::ALL
.iter()
.copied()
.find(|value| value.symbol() == code)
}
}
impl PrefixSmall {
#[must_use]
pub fn from_symbol(code: &str) -> Option<Self> {
Self::ALL
.iter()
.copied()
.find(|value| value.symbol() == code)
}
}
impl PrefixLarge {
#[must_use]
pub fn from_symbol(code: &str) -> Option<Self> {
Self::ALL
.iter()
.copied()
.find(|value| value.symbol() == code)
}
}
impl PrefixSmall {
#[must_use]
pub fn from_exponent(exponent: i8) -> Option<Self> {
Self::ALL
.iter()
.copied()
.find(|value| value.exponent() == exponent)
}
}
impl PrefixLarge {
#[must_use]
pub fn from_exponent(exponent: i8) -> Option<Self> {
Self::ALL
.iter()
.copied()
.find(|value| value.exponent() == exponent)
}
}
impl TaxonomicRank {
#[must_use]
pub const fn narrower(self) -> Option<Self> {
match self {
Self::Domain => Some(Self::Kingdom),
Self::Kingdom => Some(Self::Phylum),
Self::Phylum => Some(Self::Class),
Self::Class => Some(Self::Order),
Self::Order => Some(Self::Family),
Self::Family => Some(Self::Genus),
Self::Genus => Some(Self::Species),
Self::Species => None,
}
}
}
dataset_enum! {
pub enum SiPrefix {
Quecto = -30 => "Quecto",
Ronto = -27 => "Ronto",
Yocto = -24 => "Yocto",
Zepto = -21 => "Zepto",
Atto = -18 => "Atto",
Femto = -15 => "Femto",
Pico = -12 => "Pico",
Nano = -9 => "Nano",
Micro = -6 => "Micro",
Milli = -3 => "Milli",
Centi = -2 => "Centi",
Deci = -1 => "Deci",
Deca = 1 => "Deca",
Hecto = 2 => "Hecto",
Kilo = 3 => "Kilo",
Mega = 6 => "Mega",
Giga = 9 => "Giga",
Tera = 12 => "Tera",
Peta = 15 => "Peta",
Exa = 18 => "Exa",
Zetta = 21 => "Zetta",
Yotta = 24 => "Yotta",
Ronna = 27 => "Ronna",
Quetta = 30 => "Quetta",
}
}
impl SiPrefix {
#[must_use]
pub const fn exponent(self) -> i8 {
self as i8
}
#[must_use]
pub const fn symbol(self) -> &'static str {
match self {
Self::Deca => "da",
Self::Hecto => "h",
Self::Kilo => "k",
Self::Mega => "M",
Self::Giga => "G",
Self::Tera => "T",
Self::Peta => "P",
Self::Exa => "E",
Self::Zetta => "Z",
Self::Yotta => "Y",
Self::Ronna => "R",
Self::Quetta => "Q",
Self::Deci => "d",
Self::Centi => "c",
Self::Milli => "m",
Self::Micro => "µ",
Self::Nano => "n",
Self::Pico => "p",
Self::Femto => "f",
Self::Atto => "a",
Self::Zepto => "z",
Self::Yocto => "y",
Self::Ronto => "r",
Self::Quecto => "q",
}
}
#[must_use]
pub fn from_symbol(symbol: &str) -> Option<Self> {
Self::ALL
.iter()
.copied()
.find(|prefix| prefix.symbol() == symbol)
}
#[must_use]
pub fn from_exponent(exponent: i8) -> Option<Self> {
Self::ALL
.iter()
.copied()
.find(|prefix| prefix.exponent() == exponent)
}
}
impl From<PrefixSmall> for SiPrefix {
fn from(value: PrefixSmall) -> Self {
match value {
PrefixSmall::Deci => Self::Deci,
PrefixSmall::Centi => Self::Centi,
PrefixSmall::Milli => Self::Milli,
PrefixSmall::Micro => Self::Micro,
PrefixSmall::Nano => Self::Nano,
PrefixSmall::Pico => Self::Pico,
PrefixSmall::Femto => Self::Femto,
PrefixSmall::Atto => Self::Atto,
PrefixSmall::Zepto => Self::Zepto,
PrefixSmall::Yocto => Self::Yocto,
PrefixSmall::Ronto => Self::Ronto,
PrefixSmall::Quecto => Self::Quecto,
}
}
}
impl From<PrefixLarge> for SiPrefix {
fn from(value: PrefixLarge) -> Self {
match value {
PrefixLarge::Deca => Self::Deca,
PrefixLarge::Hecto => Self::Hecto,
PrefixLarge::Kilo => Self::Kilo,
PrefixLarge::Mega => Self::Mega,
PrefixLarge::Giga => Self::Giga,
PrefixLarge::Tera => Self::Tera,
PrefixLarge::Peta => Self::Peta,
PrefixLarge::Exa => Self::Exa,
PrefixLarge::Zetta => Self::Zetta,
PrefixLarge::Yotta => Self::Yotta,
PrefixLarge::Ronna => Self::Ronna,
PrefixLarge::Quetta => Self::Quetta,
}
}
}
dataset_enum! {
pub enum SiBaseQuantity {
Time => "Time",
Length => "Length",
Mass => "Mass",
ElectricCurrent => "Electric Current",
ThermodynamicTemperature => "Thermodynamic Temperature",
AmountOfSubstance => "Amount of Substance",
LuminousIntensity => "Luminous Intensity",
}
}
dataset_enum! {
pub enum SiBaseUnit {
Second => "Second",
Metre => "Metre",
Kilogram => "Kilogram",
Ampere => "Ampere",
Kelvin => "Kelvin",
Mole => "Mole",
Candela => "Candela",
}
}
impl SiBaseQuantity {
#[must_use]
pub const fn unit(self) -> SiBaseUnit {
match self {
Self::Time => SiBaseUnit::Second,
Self::Length => SiBaseUnit::Metre,
Self::Mass => SiBaseUnit::Kilogram,
Self::ElectricCurrent => SiBaseUnit::Ampere,
Self::ThermodynamicTemperature => SiBaseUnit::Kelvin,
Self::AmountOfSubstance => SiBaseUnit::Mole,
Self::LuminousIntensity => SiBaseUnit::Candela,
}
}
}
impl SiBaseUnit {
#[must_use]
pub const fn quantity(self) -> SiBaseQuantity {
match self {
Self::Second => SiBaseQuantity::Time,
Self::Metre => SiBaseQuantity::Length,
Self::Kilogram => SiBaseQuantity::Mass,
Self::Ampere => SiBaseQuantity::ElectricCurrent,
Self::Kelvin => SiBaseQuantity::ThermodynamicTemperature,
Self::Mole => SiBaseQuantity::AmountOfSubstance,
Self::Candela => SiBaseQuantity::LuminousIntensity,
}
}
#[must_use]
pub const fn symbol(self) -> &'static str {
match self {
Self::Second => "s",
Self::Metre => "m",
Self::Kilogram => "kg",
Self::Ampere => "A",
Self::Kelvin => "K",
Self::Mole => "mol",
Self::Candela => "cd",
}
}
#[must_use]
pub fn from_symbol(symbol: &str) -> Option<Self> {
Self::ALL
.iter()
.copied()
.find(|unit| unit.symbol() == symbol)
}
}
impl Unit {
#[must_use]
pub const fn base_quantity(self) -> Option<SiBaseQuantity> {
match self {
Self::Time => Some(SiBaseQuantity::Time),
Self::Length => Some(SiBaseQuantity::Length),
Self::Mass => Some(SiBaseQuantity::Mass),
Self::Temperature => Some(SiBaseQuantity::ThermodynamicTemperature),
Self::Volume | Self::Angle | Self::Energy => None,
}
}
}