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) + } + } }; }