Make a Char trait that provides some handy methods for Object::Char
This commit is contained in:
parent
fd5df91e27
commit
1430bdad29
1 changed files with 25 additions and 5 deletions
|
@ -7,6 +7,11 @@ mod names;
|
|||
use object::Object;
|
||||
use predicates::IsChar;
|
||||
|
||||
pub trait Char {
|
||||
fn from_char(c: char) -> Object;
|
||||
fn from_char_named(name: &str) -> Option<Object>;
|
||||
fn char_name(&self) -> Option<String>;
|
||||
}
|
||||
|
||||
impl IsChar for Object {
|
||||
fn is_char(&self) -> bool {
|
||||
|
@ -17,20 +22,28 @@ impl IsChar for Object {
|
|||
}
|
||||
}
|
||||
|
||||
impl Object {
|
||||
pub fn from_char(c: char) -> Object {
|
||||
impl Char for Object {
|
||||
fn from_char(c: char) -> Object {
|
||||
Object::Char(c)
|
||||
}
|
||||
|
||||
pub fn from_char_name(name: &str) -> Option<Object> {
|
||||
fn from_char_named(name: &str) -> Option<Object> {
|
||||
names::char_for(name).map(|c| Object::from_char(c))
|
||||
}
|
||||
|
||||
fn char_name(&self) -> Option<String> {
|
||||
match *self {
|
||||
Object::Char(c) => Some(names::name_of(c).map_or(c.to_string(), String::from)),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use object::Object;
|
||||
use predicates::{IsBool, IsChar};
|
||||
use super::Char;
|
||||
|
||||
#[test]
|
||||
fn chars_are_chars() {
|
||||
|
@ -45,7 +58,14 @@ mod tests {
|
|||
|
||||
#[test]
|
||||
fn named_chars_are_created() {
|
||||
assert_eq!(Object::from_char_name("newline"), Some(Object::from_char('\n')));
|
||||
assert_eq!(Object::from_char_name("asdf"), None);
|
||||
assert_eq!(Object::from_char_named("newline"), Some(Object::from_char('\n')));
|
||||
assert_eq!(Object::from_char_named("asdf"), None);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn chars_have_names() {
|
||||
assert_eq!(Object::from_char('a').char_name(), Some(String::from("a")));
|
||||
assert_eq!(Object::from_char('\n').char_name(), Some(String::from("newline")));
|
||||
assert_eq!(Object::Bool(true).char_name(), None);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue