From 091cc3573043ffd358fc949b6a1995d4429048a6 Mon Sep 17 00:00:00 2001
From: Mark Poliakov <mark@alnyan.me>
Date: Thu, 20 Jul 2023 16:19:07 +0300
Subject: [PATCH] Add const-default impls to Terminal structs

---
 src/io/terminal.rs | 45 ++++++++++++++++++++++++++++++++++++++++++++-
 src/macros.rs      | 14 ++++++++++++++
 2 files changed, 58 insertions(+), 1 deletion(-)

diff --git a/src/io/terminal.rs b/src/io/terminal.rs
index 0e869e86..01e7627c 100644
--- a/src/io/terminal.rs
+++ b/src/io/terminal.rs
@@ -39,8 +39,19 @@ bitflags! {
     }
 }
 
+/// Specifies a set of special control characters
+#[derive(Clone, Debug)]
+#[repr(C)]
+pub struct TerminalControlCharacters {
+    pub eof: u8,
+    pub erase: u8,
+    pub werase: u8,
+    pub interrupt: u8,
+    pub kill: u8,
+}
+
 /// Terminal I/O transformation and control settings
-#[derive(Clone, Debug, Default)]
+#[derive(Clone, Debug)]
 #[repr(C)]
 pub struct TerminalOptions {
     /// Controls output processing
@@ -49,4 +60,36 @@ pub struct TerminalOptions {
     pub input: TerminalInputOptions,
     /// Controls special bytes and line discipline
     pub line: TerminalLineOptions,
+    /// Specifies control characters of the terminal
+    pub chars: TerminalControlCharacters,
+}
+
+impl TerminalControlCharacters {
+    /// const-version of [Default] trait impl
+    pub const fn const_default() -> Self {
+        Self {
+            eof: 0x04,
+            erase: 0x7F,
+            interrupt: 0x03,
+            kill: 0x15,
+            werase: 0x17,
+        }
+    }
+}
+
+impl TerminalOptions {
+    /// const-version of [Default] trait impl
+    pub const fn const_default() -> Self {
+        Self {
+            output: TerminalOutputOptions::const_default(),
+            input: TerminalInputOptions::const_default(),
+            line: TerminalLineOptions::const_default(),
+            chars: TerminalControlCharacters::const_default(),
+        }
+    }
+
+    /// Returns `true` if CANONICAL flag is set for this terminal
+    pub const fn is_canonical(&self) -> bool {
+        self.line.contains(TerminalLineOptions::CANONICAL)
+    }
 }
diff --git a/src/macros.rs b/src/macros.rs
index 8d9a074d..02165bfa 100644
--- a/src/macros.rs
+++ b/src/macros.rs
@@ -124,6 +124,13 @@ macro_rules! bitflags_impl_default {
                 $name($($name::$flag.bits())|+)
             }
         }
+
+        impl $name {
+            /// const-version of [Default] trait impl
+            pub const fn const_default() -> Self {
+                Self($($name::$flag.bits())|+)
+            }
+        }
     };
 
     ($name:ident, $repr:ty, ()) => {
@@ -132,6 +139,13 @@ macro_rules! bitflags_impl_default {
                 $name(0)
             }
         }
+
+        impl $name {
+            /// const-version of [Default] trait impl
+            pub const fn const_default() -> Self {
+                Self(0)
+            }
+        }
     };
 }