forked from extern/nushell
f70c6d5d48
This commit extracts Tag, Span, Text, as well as source-related debug facilities into a new crate called nu_source. This change is much bigger than one might have expected because the previous code relied heavily on implementing inherent methods on `Tagged<T>` and `Spanned<T>`, which is no longer possible. As a result, this change creates more concrete types instead of using `Tagged<T>`. One notable example: Tagged<Value> became Value, and Value became UntaggedValue. This change clarifies the intent of the code in many places, but it does make it a big change.
52 lines
1.2 KiB
Rust
52 lines
1.2 KiB
Rust
use crate::pretty::ShellAnnotation;
|
|
use pretty::{Render, RenderAnnotated};
|
|
use std::io;
|
|
use termcolor::WriteColor;
|
|
|
|
pub struct TermColored<'a, W> {
|
|
color_stack: Vec<ShellAnnotation>,
|
|
upstream: &'a mut W,
|
|
}
|
|
|
|
impl<'a, W> TermColored<'a, W> {
|
|
pub fn new(upstream: &'a mut W) -> TermColored<'a, W> {
|
|
TermColored {
|
|
color_stack: Vec::new(),
|
|
upstream,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl<'a, W> Render for TermColored<'a, W>
|
|
where
|
|
W: io::Write,
|
|
{
|
|
type Error = io::Error;
|
|
|
|
fn write_str(&mut self, s: &str) -> io::Result<usize> {
|
|
self.upstream.write(s.as_bytes())
|
|
}
|
|
|
|
fn write_str_all(&mut self, s: &str) -> io::Result<()> {
|
|
self.upstream.write_all(s.as_bytes())
|
|
}
|
|
}
|
|
|
|
impl<'a, W> RenderAnnotated<ShellAnnotation> for TermColored<'a, W>
|
|
where
|
|
W: WriteColor,
|
|
{
|
|
fn push_annotation(&mut self, ann: &ShellAnnotation) -> Result<(), Self::Error> {
|
|
self.color_stack.push(*ann);
|
|
self.upstream.set_color(&(*ann).into())
|
|
}
|
|
|
|
fn pop_annotation(&mut self) -> Result<(), Self::Error> {
|
|
self.color_stack.pop();
|
|
match self.color_stack.last() {
|
|
Some(previous) => self.upstream.set_color(&(*previous).into()),
|
|
None => self.upstream.reset(),
|
|
}
|
|
}
|
|
}
|