From c288ce5de4e9c3b7a728e6c0e1f9c78e68be821e Mon Sep 17 00:00:00 2001 From: SabrinaJewson Date: Sat, 1 Apr 2023 15:26:48 +0100 Subject: [PATCH] Remove `database::Builder` --- src/database.rs | 174 ++++++++++++++--------------------------- src/parser/compiled.rs | 32 ++++---- 2 files changed, 72 insertions(+), 134 deletions(-) diff --git a/src/database.rs b/src/database.rs index eda21f6..5672cd2 100644 --- a/src/database.rs +++ b/src/database.rs @@ -28,114 +28,27 @@ use crate::parser::compiled; /// A capability database. #[derive(Eq, PartialEq, Clone, Debug)] pub struct Database { - name: String, - aliases: Vec, - description: String, - inner: HashMap>, -} - -/// Builder for a new `Database`. -#[derive(Default, Debug)] -pub struct Builder { - name: Option, - aliases: Vec, - description: Option, - inner: HashMap>, -} - -impl Builder { - /// Build the database. - pub fn build(self) -> Result { - Ok(Database { - name: self.name.ok_or(())?, - aliases: self.aliases, - description: self.description.ok_or(())?, - inner: self.inner, - }) - } - - /// Set the terminal name. - pub fn name>(&mut self, name: T) -> &mut Self { - self.name = Some(name.into()); - self - } - - /// Set the terminal aliases. - pub fn aliases(&mut self, iter: I) -> &mut Self - where - T: Into, - I: IntoIterator, - { - self.aliases = iter.into_iter().map(|a| a.into()).collect(); - self - } - - /// Set the terminal description. - pub fn description>(&mut self, description: T) -> &mut Self { - self.description = Some(description.into()); - self - } - - /// Set a capability. - /// - /// ## Example - /// - /// ``` - /// use terminfo::{Database, capability as cap}; - /// - /// let mut info = Database::new(); - /// info.name("foo"); - /// info.description("foo terminal"); - /// - /// // Set the amount of available colors. - /// info.set(cap::MaxColors(16)); - /// - /// info.build().unwrap(); - /// ``` - pub fn set<'a, C: Capability<'a>>(&'a mut self, value: C) -> &mut Self { - if !self.inner.contains_key(C::name()) { - if let Some(value) = C::into(value) { - self.inner.insert(C::name().into(), value); - } - } - - self - } + /// The terminal name. + pub name: String, - /// Set a raw capability. - /// - /// ## Example - /// - /// ``` - /// use terminfo::{Database, capability as cap}; - /// - /// let mut info = Database::new(); - /// info.name("foo"); - /// info.description("foo terminal"); - /// - /// // Set the amount of available colors. - /// info.raw("colors", 16); - /// - /// info.build().unwrap(); - /// ``` - pub fn raw, V: Into>(&mut self, name: S, value: V) -> &mut Self { - let name = name.as_ref(); - let name = names::ALIASES.get(name).copied().unwrap_or(name); + /// Aliases of the terminal. + pub aliases: Vec, - if !self.inner.contains_key(name) { - self.inner.insert(name.into(), value.into()); - } + /// The terminal description. + pub description: String, - self - } + inner: HashMap>, } impl Database { - /// Create a database builder for constucting a database. - // Clippy is right, the naming is is unconventional, but it’s probably not worth changing - #[allow(clippy::new_ret_no_self)] - pub fn new() -> Builder { - Builder::default() + /// Create a new empty terminfo database with its name and description. + pub fn new, D: Into>(name: N, description: D) -> Self { + Self { + name: name.into(), + aliases: Vec::new(), + description: description.into(), + inner: HashMap::default(), + } } /// Load a database from the current environment. @@ -230,21 +143,6 @@ impl Database { } } - /// The terminal name. - pub fn name(&self) -> &str { - &self.name - } - - /// The terminal aliases. - pub fn aliases(&self) -> &[String] { - &self.aliases - } - - /// The terminal description. - pub fn description(&self) -> &str { - &self.description - } - /// Get a capability. /// /// ## Example @@ -259,6 +157,24 @@ impl Database { C::from(self.inner.get(C::name())) } + /// Set a capability. + /// + /// ## Example + /// + /// ``` + /// let mut info = terminfo::Database::new("foo", "foo terminal"); + /// + /// // Set the amount of available colors. + /// info.set(terminfo::capability::MaxColors(16)); + /// ``` + pub fn set<'a, C: Capability<'a>>(&mut self, value: C) { + if !self.inner.contains_key(C::name()) { + if let Some(value) = C::into(value) { + self.inner.insert(C::name().into(), value); + } + } + } + /// Get a capability by name. /// /// ## Note @@ -280,4 +196,28 @@ impl Database { self.inner.get(name) } + + /// Set a raw capability. + /// + /// ## Note + /// + /// This interface only makes sense for extended capabilities since they + /// don't have standardized types. + /// + /// ## Example + /// + /// ``` + /// let mut info = terminfo::Database::new("foo", "foo terminal"); + /// + /// // Set the amount of available colors. + /// info.set_raw("colors", 16); + /// ``` + pub fn set_raw, V: Into>(&mut self, name: S, value: V) { + let name = name.as_ref(); + let name = names::ALIASES.get(name).copied().unwrap_or(name); + + if !self.inner.contains_key(name) { + self.inner.insert(name.into(), value.into()); + } + } } diff --git a/src/parser/compiled.rs b/src/parser/compiled.rs index ced3db3..33c3fcd 100644 --- a/src/parser/compiled.rs +++ b/src/parser/compiled.rs @@ -35,24 +35,22 @@ impl<'a> From> for crate::Database { let mut names = source .names .split(|&c| c == b'|') - .map(|s| unsafe { str::from_utf8_unchecked(s) }) - .map(|s| s.trim()) - .collect::>(); + .map(|s| (unsafe { str::from_utf8_unchecked(s) }).trim().to_owned()); - let mut database = crate::Database::new(); - - database.name(names.remove(0)).description(names.pop().unwrap()).aliases(names); + let mut database = crate::Database::new(names.next().unwrap(), ""); + database.aliases = names.collect(); + database.description = database.aliases.pop().unwrap(); for (index, _) in source.standard.booleans.iter().enumerate().filter(|&(_, &value)| value) { if let Some(&name) = names::BOOLEAN.get(&(index as u16)) { - database.raw(name, Value::True); + database.set_raw(name, Value::True); } } for (index, &value) in source.standard.numbers.iter().enumerate().filter(|&(_, &n)| n >= 0) { if let Some(&name) = names::NUMBER.get(&(index as u16)) { - database.raw(name, Value::Number(value)); + database.set_raw(name, Value::Number(value)); } } @@ -62,7 +60,7 @@ impl<'a> From> for crate::Database { let string = &source.standard.table[offset as usize..]; let edge = string.iter().position(|&c| c == 0).unwrap(); - database.raw(name, Value::String(Vec::from(&string[..edge]))); + database.set_raw(name, Value::String(Vec::from(&string[..edge]))); } } @@ -75,25 +73,25 @@ impl<'a> From> for crate::Database { .collect::>(); for (index, _) in extended.booleans.iter().enumerate().filter(|&(_, &value)| value) { - database.raw(names[index], Value::True); + database.set_raw(names[index], Value::True); } for (index, &value) in extended.numbers.iter().enumerate().filter(|&(_, &n)| n >= 0) { - database.raw(names[extended.booleans.len() + index], Value::Number(value)); + database.set_raw(names[extended.booleans.len() + index], Value::Number(value)); } for (index, &offset) in extended.strings.iter().enumerate().filter(|&(_, &n)| n >= 0) { let string = &extended.table[offset as usize..]; let edge = string.iter().position(|&c| c == 0).unwrap(); - database.raw( + database.set_raw( names[extended.booleans.len() + extended.numbers.len() + index], Value::String(Vec::from(&string[..edge])), ); } } - database.build().unwrap() + database } } @@ -218,18 +216,18 @@ mod test { #[test] fn name() { - load("tests/cancer-256color", |db| assert_eq!("cancer-256color", db.name())); + load("tests/cancer-256color", |db| assert_eq!("cancer-256color", db.name)); } #[test] fn aliases() { - load("tests/st-256color", |db| assert_eq!(vec!["stterm-256color"], db.aliases())); + load("tests/st-256color", |db| assert_eq!(vec!["stterm-256color"], db.aliases)); } #[test] fn description() { load("tests/cancer-256color", |db| { - assert_eq!("terminal cancer with 256 colors", db.description()) + assert_eq!("terminal cancer with 256 colors", db.description) }); } @@ -253,6 +251,6 @@ mod test { #[test] fn bigger_numbers() { - load("tests/xterm-256color", |db| assert_eq!("xterm-256color", db.name())); + load("tests/xterm-256color", |db| assert_eq!("xterm-256color", db.name)); } }