diff options
-rw-r--r-- | src/lib.rs | 206 |
1 files changed, 188 insertions, 18 deletions
@@ -217,24 +217,194 @@ impl Default for ColorSettings { } } -impl ColorSettings { - pub fn arithmetic_op(&self) -> &color::Fg<&'static color::Color> { &self.arithmetic } - pub fn stack_op(&self) -> &color::Fg<&'static color::Color> { &self.stack } - pub fn nop_op(&self) -> &color::Fg<&'static color::Color> { &self.nop } - pub fn stop_op(&self) -> &color::Fg<&'static color::Color> { &self.stop } - pub fn control_flow_op(&self) -> &color::Fg<&'static color::Color> { &self.control } - pub fn data_op(&self) -> &color::Fg<&'static color::Color> { &self.data } - pub fn comparison_op(&self) -> &color::Fg<&'static color::Color> { &self.comparison } - pub fn invalid_op(&self) -> &color::Fg<&'static color::Color> { &self.invalid } - - pub fn register(&self) -> &color::Fg<&'static color::Color> { &self.register } - pub fn number(&self) -> &color::Fg<&'static color::Color> { &self.number } - pub fn zero(&self) -> &color::Fg<&'static color::Color> { &self.zero } - pub fn one(&self) -> &color::Fg<&'static color::Color> { &self.one } - pub fn minus_one(&self) -> &color::Fg<&'static color::Color> { &self.minus_one } - pub fn address(&self) -> &color::Fg<&'static color::Color> { &self.address } - pub fn symbol(&self) -> &color::Fg<&'static color::Color> { &self.symbol } - pub fn function(&self) -> &color::Fg<&'static color::Color> { &self.function } +pub trait YaxColors { + fn arithmetic_op<T: Display>(&self, t: T) -> Colored<T>; + fn stack_op<T: Display>(&self, t: T) -> Colored<T>; + fn nop_op<T: Display>(&self, t: T) -> Colored<T>; + fn stop_op<T: Display>(&self, t: T) -> Colored<T>; + fn control_flow_op<T: Display>(&self, t: T) -> Colored<T>; + fn data_op<T: Display>(&self, t: T) -> Colored<T>; + fn comparison_op<T: Display>(&self, t: T) -> Colored<T>; + fn invalid_op<T: Display>(&self, t: T) -> Colored<T>; + + fn register<T: Display>(&self, t: T) -> Colored<T>; + fn number<T: Display>(&self, t: T) -> Colored<T>; + fn zero<T: Display>(&self, t: T) -> Colored<T>; + fn one<T: Display>(&self, t: T) -> Colored<T>; + fn minus_one<T: Display>(&self, t: T) -> Colored<T>; + fn address<T: Display>(&self, t: T) -> Colored<T>; + fn symbol<T: Display>(&self, t: T) -> Colored<T>; + fn function<T: Display>(&self, t: T) -> Colored<T>; +} + +impl YaxColors for ColorSettings { + fn arithmetic_op<T: Display>(&self, t: T) -> Colored<T> { + Colored::Color(t, self.arithmetic) + } + fn stack_op<T: Display>(&self, t: T) -> Colored<T> { + Colored::Color(t, self.stack) + } + fn nop_op<T: Display>(&self, t: T) -> Colored<T> { + Colored::Color(t, self.nop) + } + fn stop_op<T: Display>(&self, t: T) -> Colored<T> { + Colored::Color(t, self.stop) + } + fn control_flow_op<T: Display>(&self, t: T) -> Colored<T> { + Colored::Color(t, self.control) + } + fn data_op<T: Display>(&self, t: T) -> Colored<T> { + Colored::Color(t, self.data) + } + fn comparison_op<T: Display>(&self, t: T) -> Colored<T> { + Colored::Color(t, self.comparison) + } + fn invalid_op<T: Display>(&self, t: T) -> Colored<T> { + Colored::Color(t, self.invalid) + } + + fn register<T: Display>(&self, t: T) -> Colored<T> { + Colored::Color(t, self.register) + } + fn number<T: Display>(&self, t: T) -> Colored<T> { + Colored::Color(t, self.number) + } + fn zero<T: Display>(&self, t: T) -> Colored<T> { + Colored::Color(t, self.zero) + } + fn one<T: Display>(&self, t: T) -> Colored<T> { + Colored::Color(t, self.one) + } + fn minus_one<T: Display>(&self, t: T) -> Colored<T> { + Colored::Color(t, self.minus_one) + } + fn address<T: Display>(&self, t: T) -> Colored<T> { + Colored::Color(t, self.address) + } + fn symbol<T: Display>(&self, t: T) -> Colored<T> { + Colored::Color(t, self.symbol) + } + fn function<T: Display>(&self, t: T) -> Colored<T> { + Colored::Color(t, self.function) + } +} + +impl <'a> YaxColors for Option<&'a ColorSettings> { + fn arithmetic_op<T: Display>(&self, t: T) -> Colored<T> { + match self { + Some(colors) => { colors.arithmetic_op(t) } + None => { Colored::Just(t) } + } + } + fn stack_op<T: Display>(&self, t: T) -> Colored<T> { + match self { + Some(colors) => { colors.stack_op(t) } + None => { Colored::Just(t) } + } + } + fn nop_op<T: Display>(&self, t: T) -> Colored<T> { + match self { + Some(colors) => { colors.nop_op(t) } + None => { Colored::Just(t) } + } + } + fn stop_op<T: Display>(&self, t: T) -> Colored<T> { + match self { + Some(colors) => { colors.stop_op(t) } + None => { Colored::Just(t) } + } + } + fn control_flow_op<T: Display>(&self, t: T) -> Colored<T> { + match self { + Some(colors) => { colors.control_flow_op(t) } + None => { Colored::Just(t) } + } + } + fn data_op<T: Display>(&self, t: T) -> Colored<T> { + match self { + Some(colors) => { colors.data_op(t) } + None => { Colored::Just(t) } + } + } + fn comparison_op<T: Display>(&self, t: T) -> Colored<T> { + match self { + Some(colors) => { colors.comparison_op(t) } + None => { Colored::Just(t) } + } + } + fn invalid_op<T: Display>(&self, t: T) -> Colored<T> { + match self { + Some(colors) => { colors.invalid_op(t) } + None => { Colored::Just(t) } + } + } + + fn register<T: Display>(&self, t: T) -> Colored<T> { + match self { + Some(colors) => { colors.register(t) } + None => { Colored::Just(t) } + } + } + fn number<T: Display>(&self, t: T) -> Colored<T> { + match self { + Some(colors) => { colors.number(t) } + None => { Colored::Just(t) } + } + } + fn zero<T: Display>(&self, t: T) -> Colored<T> { + match self { + Some(colors) => { colors.zero(t) } + None => { Colored::Just(t) } + } + } + fn one<T: Display>(&self, t: T) -> Colored<T> { + match self { + Some(colors) => { colors.one(t) } + None => { Colored::Just(t) } + } + } + fn minus_one<T: Display>(&self, t: T) -> Colored<T> { + match self { + Some(colors) => { colors.minus_one(t) } + None => { Colored::Just(t) } + } + } + fn address<T: Display>(&self, t: T) -> Colored<T> { + match self { + Some(colors) => { colors.address(t) } + None => { Colored::Just(t) } + } + } + fn symbol<T: Display>(&self, t: T) -> Colored<T> { + match self { + Some(colors) => { colors.symbol(t) } + None => { Colored::Just(t) } + } + } + fn function<T: Display>(&self, t: T) -> Colored<T> { + match self { + Some(colors) => { colors.function(t) } + None => { Colored::Just(t) } + } + } +} + +pub enum Colored<T: Display> { + Color(T, color::Fg<&'static color::Color>), + Just(T) +} + +impl <T: Display> Display for Colored<T> { + fn fmt(&self, fmt: &mut Formatter) -> std::fmt::Result { + match self { + Colored::Color(t, color) => { + write!(fmt, "{}{}{}", color, t, color::Fg(color::Reset)) + }, + Colored::Just(t) => { + write!(fmt, "{}", t) + } + } + } } /* |