htop 0.3.1

HTML to PDF converter
//! # Paper definitions

use crate::errors::{err_invalid_paper_format, HtopError};

/// Length of the inch expressed in millimeters.
const MM_PER_INCH: f64 = 25.4;

/// Paper size definitions.
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;
  /// Converts [PaperSize] from a reference to [String].
  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)),
    }
  }
}

/// Paper properties.
pub struct Paper {
  /// Paper width in inches.
  width: f64,
  /// Paper height in inches.
  height: f64,
}

impl Paper {
  /// Creates a new paper with specified size.
  pub fn new(paper_size: PaperSize) -> Self {
    // get paper size in millimeters
    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),
    };
    // create paper with sizes in inches
    Self {
      width: width / MM_PER_INCH,
      height: height / MM_PER_INCH,
    }
  }

  /// Returns paper width in inches.
  pub fn width(&self) -> f64 {
    self.width
  }

  /// Returns paper height in inches.
  pub fn height(&self) -> f64 {
    self.height
  }
}