#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct CharCode(pub u32);
impl From<CharCode> for u32 {
fn from(c: CharCode) -> Self {
c.0
}
}
impl From<u32> for CharCode {
fn from(v: u32) -> Self {
Self(v)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct Cid(pub u16);
impl From<Cid> for u16 {
fn from(c: Cid) -> Self {
c.0
}
}
impl From<u16> for Cid {
fn from(v: u16) -> Self {
Self(v)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
#[repr(u8)]
pub enum CidSet {
#[default]
Unknown = 0,
Gb1 = 1,
Cns1 = 2,
Japan1 = 3,
Korea1 = 4,
Unicode = 5,
}
impl CidSet {
#[must_use]
pub fn ordinal(self) -> u8 {
self as u8
}
pub(crate) fn registry_index(self) -> Option<usize> {
match self {
Self::Gb1 => Some(0),
Self::Cns1 => Some(1),
Self::Japan1 => Some(2),
Self::Korea1 => Some(3),
Self::Unknown | Self::Unicode => None,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
#[repr(u8)]
pub enum CidCoding {
#[default]
Unknown = 0,
Gb = 1,
Big5 = 2,
Jis = 3,
Korea = 4,
Ucs2 = 5,
Cid = 6,
Utf16 = 7,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum CodingScheme {
OneByte,
#[default]
TwoBytes,
MixedTwoBytes,
MixedFourBytes,
}
#[cfg(test)]
mod tests {
use super::{CharCode, Cid, CidCoding, CidSet, CodingScheme};
#[test]
fn ordinals_match_the_blob_numbering() {
assert_eq!(CidSet::Unknown.ordinal(), 0);
assert_eq!(CidSet::Gb1.ordinal(), 1);
assert_eq!(CidSet::Cns1.ordinal(), 2);
assert_eq!(CidSet::Japan1.ordinal(), 3);
assert_eq!(CidSet::Korea1.ordinal(), 4);
assert_eq!(CidSet::Unicode.ordinal(), 5);
assert_eq!(CidCoding::Unknown as u8, 0);
assert_eq!(CidCoding::Utf16 as u8, 7);
}
#[test]
fn only_the_four_cjk_registries_have_a_blob_index() {
assert_eq!(CidSet::Gb1.registry_index(), Some(0));
assert_eq!(CidSet::Korea1.registry_index(), Some(3));
assert_eq!(CidSet::Unicode.registry_index(), None);
assert_eq!(CidSet::Unknown.registry_index(), None);
}
#[test]
fn defaults_are_the_fallback_state() {
assert_eq!(CodingScheme::default(), CodingScheme::TwoBytes);
assert_eq!(CidSet::default(), CidSet::Unknown);
assert_eq!(CidCoding::default(), CidCoding::Unknown);
assert_eq!(CharCode::default().0, 0);
assert_eq!(Cid::default().0, 0);
}
}