use crate::errors::{err_invalid_paper_format, HtopError};
const MM_PER_INCH: f64 = 25.4;
pub enum PaperSize {
A0,
A1,
A2,
A3,
A4,
A5,
A6,
A7,
A8,
A9,
A10,
A11,
A12,
A13,
TwoA0,
FourA0,
A0plus,
A1plus,
A3plus,
B0,
B1,
B2,
B3,
B4,
B5,
B6,
B7,
B8,
B9,
B10,
B11,
B12,
B13,
B0plus,
B1plus,
B2plus,
C0,
C1,
C2,
C3,
C4,
C5,
C6,
C7,
C8,
C9,
C10,
Letter,
Legal,
Tabloid,
Ledger,
JuniorLegal,
HalfLetter,
GovernmentLetter,
GovernmentLegal,
AnsiA,
AnsiB,
AnsiC,
AnsiD,
AnsiE,
ArchA,
ArchB,
ArchC,
ArchD,
ArchE,
ArchE1,
ArchE2,
ArchE3,
}
impl TryFrom<&str> for PaperSize {
type Error = HtopError;
fn try_from(value: &str) -> Result<Self, Self::Error> {
match value {
"A0" => Ok(Self::A0),
"A1" => Ok(Self::A1),
"A2" => Ok(Self::A2),
"A3" => Ok(Self::A3),
"A4" => Ok(Self::A4),
"A5" => Ok(Self::A5),
"A6" => Ok(Self::A6),
"A7" => Ok(Self::A7),
"A8" => Ok(Self::A8),
"A9" => Ok(Self::A9),
"A10" => Ok(Self::A10),
"A11" => Ok(Self::A11),
"A12" => Ok(Self::A12),
"A13" => Ok(Self::A13),
"2A0" => Ok(Self::TwoA0),
"4A0" => Ok(Self::FourA0),
"A0+" => Ok(Self::A0plus),
"A1+" => Ok(Self::A1plus),
"A3+" => Ok(Self::A3plus),
"B0" => Ok(Self::B0),
"B1" => Ok(Self::B1),
"B2" => Ok(Self::B2),
"B3" => Ok(Self::B3),
"B4" => Ok(Self::B4),
"B5" => Ok(Self::B5),
"B6" => Ok(Self::B6),
"B7" => Ok(Self::B7),
"B8" => Ok(Self::B8),
"B9" => Ok(Self::B9),
"B10" => Ok(Self::B10),
"B11" => Ok(Self::B11),
"B12" => Ok(Self::B12),
"B13" => Ok(Self::B13),
"B0+" => Ok(Self::B0plus),
"B1+" => Ok(Self::B1plus),
"B2+" => Ok(Self::B2plus),
"C0" => Ok(Self::C0),
"C1" => Ok(Self::C1),
"C2" => Ok(Self::C2),
"C3" => Ok(Self::C3),
"C4" => Ok(Self::C4),
"C5" => Ok(Self::C5),
"C6" => Ok(Self::C6),
"C7" => Ok(Self::C7),
"C8" => Ok(Self::C8),
"C9" => Ok(Self::C9),
"C10" => Ok(Self::C10),
"Letter" => Ok(Self::Letter),
"Legal" => Ok(Self::Legal),
"Tabloid" => Ok(Self::Tabloid),
"Ledger" => Ok(Self::Ledger),
"Junior Legal" => Ok(Self::JuniorLegal),
"Half Letter" => Ok(Self::HalfLetter),
"Government Letter" => Ok(Self::GovernmentLetter),
"Government Legal" => Ok(Self::GovernmentLegal),
"Ansi A" => Ok(Self::AnsiA),
"Ansi B" => Ok(Self::AnsiB),
"Ansi C" => Ok(Self::AnsiC),
"Ansi D" => Ok(Self::AnsiD),
"Ansi E" => Ok(Self::AnsiE),
"Arch A" => Ok(Self::ArchA),
"Arch B" => Ok(Self::ArchB),
"Arch C" => Ok(Self::ArchC),
"Arch D" => Ok(Self::ArchD),
"Arch E" => Ok(Self::ArchE),
"Arch E1" => Ok(Self::ArchE1),
"Arch E2" => Ok(Self::ArchE2),
"Arch E3" => Ok(Self::ArchE3),
other => Err(err_invalid_paper_format(other)),
}
}
}
pub struct Paper {
width: f64,
height: f64,
}
impl Paper {
pub fn new(paper_size: PaperSize) -> Self {
let (width, height) = match paper_size {
PaperSize::A0 => (841.0, 1189.0),
PaperSize::A1 => (594.0, 841.0),
PaperSize::A2 => (420.0, 594.0),
PaperSize::A3 => (297.0, 420.0),
PaperSize::A4 => (210.0, 297.0),
PaperSize::A5 => (148.0, 210.0),
PaperSize::A6 => (105.0, 148.0),
PaperSize::A7 => (74.0, 105.0),
PaperSize::A8 => (52.0, 74.0),
PaperSize::A9 => (37.0, 52.0),
PaperSize::A10 => (26.0, 37.0),
PaperSize::A11 => (18.0, 26.0),
PaperSize::A12 => (13.0, 18.0),
PaperSize::A13 => (9.0, 13.0),
PaperSize::TwoA0 => (1189.0, 1682.0),
PaperSize::FourA0 => (1682.0, 2378.0),
PaperSize::A0plus => (914.0, 1292.0),
PaperSize::A1plus => (609.0, 914.0),
PaperSize::A3plus => (329.0, 483.0),
PaperSize::B0 => (1000.0, 1414.0),
PaperSize::B1 => (707.0, 1000.0),
PaperSize::B2 => (500.0, 707.0),
PaperSize::B3 => (353.0, 500.0),
PaperSize::B4 => (250.0, 353.0),
PaperSize::B5 => (176.0, 250.0),
PaperSize::B6 => (125.0, 176.0),
PaperSize::B7 => (88.0, 125.0),
PaperSize::B8 => (62.0, 88.0),
PaperSize::B9 => (44.0, 62.0),
PaperSize::B10 => (31.0, 44.0),
PaperSize::B11 => (22.0, 31.0),
PaperSize::B12 => (15.0, 22.0),
PaperSize::B13 => (11.0, 15.0),
PaperSize::B0plus => (1118.0, 1580.0),
PaperSize::B1plus => (720.0, 1020.0),
PaperSize::B2plus => (520.0, 720.0),
PaperSize::C0 => (917.0, 1297.0),
PaperSize::C1 => (648.0, 917.0),
PaperSize::C2 => (458.0, 648.0),
PaperSize::C3 => (324.0, 458.0),
PaperSize::C4 => (229.0, 324.0),
PaperSize::C5 => (162.0, 229.0),
PaperSize::C6 => (114.0, 162.0),
PaperSize::C7 => (81.0, 114.0),
PaperSize::C8 => (57.0, 81.0),
PaperSize::C9 => (40.0, 57.0),
PaperSize::C10 => (28.0, 40.0),
PaperSize::Letter => (216.0, 279.0),
PaperSize::Legal => (216.0, 356.0),
PaperSize::Tabloid => (279.0, 432.0),
PaperSize::Ledger => (432.0, 279.0),
PaperSize::JuniorLegal => (127.0, 203.0),
PaperSize::HalfLetter => (140.0, 216.0),
PaperSize::GovernmentLetter => (203.0, 267.0),
PaperSize::GovernmentLegal => (216.0, 330.0),
PaperSize::AnsiA => (216.0, 279.0),
PaperSize::AnsiB => (279.0, 432.0),
PaperSize::AnsiC => (432.0, 559.0),
PaperSize::AnsiD => (559.0, 864.0),
PaperSize::AnsiE => (864.0, 1118.0),
PaperSize::ArchA => (229.0, 305.0),
PaperSize::ArchB => (305.0, 457.0),
PaperSize::ArchC => (457.0, 610.0),
PaperSize::ArchD => (610.0, 914.0),
PaperSize::ArchE => (914.0, 1219.0),
PaperSize::ArchE1 => (762.0, 1067.0),
PaperSize::ArchE2 => (660.0, 965.0),
PaperSize::ArchE3 => (686.0, 991.0),
};
Self {
width: width / MM_PER_INCH,
height: height / MM_PER_INCH,
}
}
pub fn width(&self) -> f64 {
self.width
}
pub fn height(&self) -> f64 {
self.height
}
}