mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Escape ansi sequences
This commit is contained in:
parent
c399afa7c5
commit
a2d70e6ff6
10
Cargo.lock
generated
10
Cargo.lock
generated
@ -69,6 +69,15 @@ version = "0.1.2"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b8052e2d8aabbb8d556d6abbcce2a22b9590996c5f849b9c7ce4544a2e3b984e"
|
checksum = "b8052e2d8aabbb8d556d6abbcce2a22b9590996c5f849b9c7ce4544a2e3b984e"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ansi-parser"
|
||||||
|
version = "0.6.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "761ac675f1638a6a49e26f6ac3a4067ca3fefa8029816ae4ef8d3fa3d06a5194"
|
||||||
|
dependencies = [
|
||||||
|
"nom 4.2.3",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ansi_term"
|
name = "ansi_term"
|
||||||
version = "0.11.0"
|
version = "0.11.0"
|
||||||
@ -4901,6 +4910,7 @@ dependencies = [
|
|||||||
name = "veloren-server-cli"
|
name = "veloren-server-cli"
|
||||||
version = "0.7.0"
|
version = "0.7.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"ansi-parser",
|
||||||
"crossterm",
|
"crossterm",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"tracing",
|
"tracing",
|
||||||
|
@ -17,3 +17,4 @@ tracing-subscriber = { version = "0.2.3", default-features = false, features = [
|
|||||||
crossterm = "0.17"
|
crossterm = "0.17"
|
||||||
tui = { version = "0.10", default-features = false, features = ['crossterm'] }
|
tui = { version = "0.10", default-features = false, features = ['crossterm'] }
|
||||||
lazy_static = "1"
|
lazy_static = "1"
|
||||||
|
ansi-parser = "0.6"
|
||||||
|
@ -27,6 +27,54 @@ lazy_static! {
|
|||||||
static ref LOG: TuiLog<'static> = TuiLog::default();
|
static ref LOG: TuiLog<'static> = TuiLog::default();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Default, Clone)]
|
||||||
|
struct TuiLog<'a> {
|
||||||
|
inner: Arc<Mutex<Text<'a>>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> TuiLog<'a> {
|
||||||
|
fn resize(&self, h: usize) {
|
||||||
|
let mut inner = self.inner.lock().unwrap();
|
||||||
|
|
||||||
|
if inner.height() > h {
|
||||||
|
let length = inner.height() - h;
|
||||||
|
inner.lines.drain(0..length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Write for TuiLog<'a> {
|
||||||
|
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
|
||||||
|
use ansi_parser::{AnsiParser, AnsiSequence, Output};
|
||||||
|
use tui::text::{Span,Spans};
|
||||||
|
|
||||||
|
let line = String::from_utf8(buf.into())
|
||||||
|
.map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;
|
||||||
|
|
||||||
|
let mut spans = Vec::new();
|
||||||
|
|
||||||
|
for out in line.ansi_parse() {
|
||||||
|
match out {
|
||||||
|
Output::TextBlock(text) => spans.push(text.to_string().into()),
|
||||||
|
Output::Escape(seq) => info!("{:?}",seq)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self.inner.lock().unwrap().lines.push(Spans(spans));
|
||||||
|
|
||||||
|
Ok(buf.len())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn flush(&mut self) -> io::Result<()> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Copy, Clone)]
|
||||||
|
enum Message {
|
||||||
|
Quit,
|
||||||
|
}
|
||||||
|
|
||||||
fn main() -> io::Result<()> {
|
fn main() -> io::Result<()> {
|
||||||
// Init logging
|
// Init logging
|
||||||
let filter = match std::env::var_os(RUST_LOG_ENV).map(|s| s.into_string()) {
|
let filter = match std::env::var_os(RUST_LOG_ENV).map(|s| s.into_string()) {
|
||||||
@ -99,7 +147,7 @@ fn main() -> io::Result<()> {
|
|||||||
|
|
||||||
use crossterm::event::{KeyModifiers, *};
|
use crossterm::event::{KeyModifiers, *};
|
||||||
|
|
||||||
if poll(Duration::from_millis(50)).unwrap() {
|
if poll(Duration::from_millis(10)).unwrap() {
|
||||||
// It's guaranteed that the `read()` won't block when the `poll()`
|
// It's guaranteed that the `read()` won't block when the `poll()`
|
||||||
// function returns `true`
|
// function returns `true`
|
||||||
match read().unwrap() {
|
match read().unwrap() {
|
||||||
@ -183,37 +231,3 @@ fn main() -> io::Result<()> {
|
|||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone)]
|
|
||||||
struct TuiLog<'a> {
|
|
||||||
inner: Arc<Mutex<Text<'a>>>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> TuiLog<'a> {
|
|
||||||
fn resize(&self, h: usize) {
|
|
||||||
let mut inner = self.inner.lock().unwrap();
|
|
||||||
|
|
||||||
if inner.height() > h {
|
|
||||||
let length = inner.height() - h;
|
|
||||||
inner.lines.drain(0..length);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> Write for TuiLog<'a> {
|
|
||||||
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
|
|
||||||
let line = String::from_utf8(buf.into())
|
|
||||||
.map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;
|
|
||||||
|
|
||||||
self.inner.lock().unwrap().lines.push(From::from(line));
|
|
||||||
|
|
||||||
Ok(buf.len())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn flush(&mut self) -> io::Result<()> { Ok(()) }
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Copy, Clone)]
|
|
||||||
enum Message {
|
|
||||||
Quit,
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user