From 4d87bb46dff6ba21e210a2d9173b5725c629c79a Mon Sep 17 00:00:00 2001 From: "Hatter Jiang@Pixelbook" Date: Tue, 6 Aug 2019 08:48:22 +0800 Subject: [PATCH] add src/util_msg.rs --- src/lib.rs | 78 ++---------------------------------------------- src/util_io.rs | 2 +- src/util_msg.rs | 79 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 77 deletions(-) create mode 100644 src/util_msg.rs diff --git a/src/lib.rs b/src/lib.rs index 36909df..5be295a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,7 +4,7 @@ use std::{ //cell::RefCell, env, fs, - io::{self, Write, Error, ErrorKind}, + io::{self, Error, ErrorKind}, path::{Path, PathBuf}, process::Command, }; @@ -18,6 +18,7 @@ pub const SIZE_TB: i64 = SIZE_PB * SIZE_KB; pub mod util_io; pub mod util_os; +pub mod util_msg; pub type XResult = Result>; @@ -113,81 +114,6 @@ pub fn new_box_ioerror(m: &str) -> Box { Box::new(Error::new(ErrorKind::Other, m)) } -pub enum MessageType { INFO, OK, WARN, ERROR, } - -pub fn print_color(color: Option, is_bold: bool, m: &str) { - let mut t = term::stdout().unwrap(); - match color { - Some(c) => t.fg(c).unwrap(), - None => (), - } - if is_bold { - t.attr(term::Attr::Bold).unwrap(); - } - write!(t, "{}", m).unwrap(); - t.reset().unwrap(); -} - -pub fn print_color_and_flush(color: Option, is_bold: bool, m: &str) { - print_color(color, is_bold, m); - flush_stdout(); -} - -pub fn print_message_ex(color: Option, h: &str, message: &str) { - print_color(color, true, h); - println!(" {}", message); -} - -pub fn print_message(mt: MessageType, message: &str) { - match mt { - MessageType::OK => print_message_ex(Some(term::color::GREEN), "[OK ]", message), - MessageType::WARN => print_message_ex(Some(term::color::YELLOW), "[WARN ]", message), - MessageType::ERROR => print_message_ex(Some(term::color::RED), "[ERROR]", message), - MessageType::INFO => print_message_ex(None, "[INFO]", message), - } -} - -pub fn flush_stdout() { - io::stdout().flush().ok(); -} - -pub fn clear_lastline() { - print_lastline(""); -} - -pub fn print_lastline(line: &str) { - print!("\x1b[1000D{}\x1b[K", line); - flush_stdout(); -} - -// thanks https://blog.csdn.net/star_xiong/article/details/89401149 -pub fn find_char_boundary(s: &str, index: usize) -> usize { - if s.len() <= index { - return index; - } - let mut new_index = index; - while !s.is_char_boundary(new_index) { - new_index += 1; - } - new_index -} - -pub fn get_term_width_message(message: &str, left: usize) -> String { - match term_size::dimensions() { - None => message.to_string(), - Some((w, _h)) => { - let len = message.len(); - if w > len { - return message.to_string(); - } - let mut s = String::new(); - s.push_str(&message[0..find_char_boundary(&message, w-10-5-left)]); - s.push_str("[...]"); - s.push_str(&message[find_char_boundary(&message, len-10)..]); - s - }, - } -} pub fn parse_size(size: &str) -> XResult { let lower_size = size.to_lowercase(); diff --git a/src/util_io.rs b/src/util_io.rs index e1246c7..32351d9 100644 --- a/src/util_io.rs +++ b/src/util_io.rs @@ -5,7 +5,7 @@ use std::{ }; use super::get_display_size; -use super::print_lastline; +use super::util_msg::print_lastline; pub const DEFAULT_BUF_SIZE: usize = 8 * 1024; pub const SIZE_KB: i64 = 1024; diff --git a/src/util_msg.rs b/src/util_msg.rs new file mode 100644 index 0000000..3509375 --- /dev/null +++ b/src/util_msg.rs @@ -0,0 +1,79 @@ +use std::{ + io::{self, Write}, +}; + +pub enum MessageType { INFO, OK, WARN, ERROR, } + +pub fn print_color(color: Option, is_bold: bool, m: &str) { + let mut t = term::stdout().unwrap(); + match color { + Some(c) => t.fg(c).unwrap(), + None => (), + } + if is_bold { + t.attr(term::Attr::Bold).unwrap(); + } + write!(t, "{}", m).unwrap(); + t.reset().unwrap(); +} + +pub fn print_color_and_flush(color: Option, is_bold: bool, m: &str) { + print_color(color, is_bold, m); + flush_stdout(); +} + +pub fn print_message_ex(color: Option, h: &str, message: &str) { + print_color(color, true, h); + println!(" {}", message); +} + +pub fn print_message(mt: MessageType, message: &str) { + match mt { + MessageType::OK => print_message_ex(Some(term::color::GREEN), "[OK ]", message), + MessageType::WARN => print_message_ex(Some(term::color::YELLOW), "[WARN ]", message), + MessageType::ERROR => print_message_ex(Some(term::color::RED), "[ERROR]", message), + MessageType::INFO => print_message_ex(None, "[INFO]", message), + } +} + +pub fn flush_stdout() { + io::stdout().flush().ok(); +} + +pub fn clear_lastline() { + print_lastline(""); +} + +pub fn print_lastline(line: &str) { + print!("\x1b[1000D{}\x1b[K", line); + flush_stdout(); +} + +// thanks https://blog.csdn.net/star_xiong/article/details/89401149 +pub fn find_char_boundary(s: &str, index: usize) -> usize { + if s.len() <= index { + return index; + } + let mut new_index = index; + while !s.is_char_boundary(new_index) { + new_index += 1; + } + new_index +} + +pub fn get_term_width_message(message: &str, left: usize) -> String { + match term_size::dimensions() { + None => message.to_string(), + Some((w, _h)) => { + let len = message.len(); + if w > len { + return message.to_string(); + } + let mut s = String::new(); + s.push_str(&message[0..find_char_boundary(&message, w-10-5-left)]); + s.push_str("[...]"); + s.push_str(&message[find_char_boundary(&message, len-10)..]); + s + }, + } +}