1#![forbid(unsafe_code)]
2#![deny(missing_docs)]
3
4#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
8#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9pub struct TerminalSize {
10 pub cols: u16,
12 pub rows: u16,
14}
15
16impl TerminalSize {
17 #[must_use]
19 pub const fn new(cols: u16, rows: u16) -> Self {
20 Self { cols, rows }
21 }
22
23 #[must_use]
25 pub const fn into_geometry(self) -> TerminalGeometry {
26 TerminalGeometry::from_size(self)
27 }
28}
29
30#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
33#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
34pub struct TerminalPixels {
35 pub width: u16,
37 pub height: u16,
39}
40
41impl TerminalPixels {
42 #[must_use]
44 pub const fn new(width: u16, height: u16) -> Self {
45 Self { width, height }
46 }
47}
48
49#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
51#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
52pub struct TerminalGeometry {
53 pub size: TerminalSize,
55 pub pixels: Option<TerminalPixels>,
57}
58
59impl TerminalGeometry {
60 #[must_use]
62 pub const fn new(cols: u16, rows: u16) -> Self {
63 Self {
64 size: TerminalSize::new(cols, rows),
65 pixels: None,
66 }
67 }
68
69 #[must_use]
71 pub const fn from_size(size: TerminalSize) -> Self {
72 Self { size, pixels: None }
73 }
74
75 #[must_use]
77 pub const fn with_pixels(mut self, pixels: TerminalPixels) -> Self {
78 self.pixels = Some(pixels);
79 self
80 }
81}