diff --git a/src/bin/oura/watch.rs b/src/bin/oura/watch.rs index df1af3b7..9b4b56be 100644 --- a/src/bin/oura/watch.rs +++ b/src/bin/oura/watch.rs @@ -77,6 +77,11 @@ pub fn run(args: &ArgMatches) -> Result<(), Error> { false => None, }; + let terminal_width = match args.is_present("terminal-width") { + true => Some(args.value_of_t("terminal-width")?), + false => None + }; + let mapper = MapperConfig { include_block_end_events: true, ..Default::default() @@ -114,6 +119,7 @@ pub fn run(args: &ArgMatches) -> Result<(), Error> { let sink_setup = oura::sinks::terminal::Config { throttle_min_span_millis: throttle, + terminal_width: terminal_width }; let (source_handle, source_output) = match source_setup { @@ -152,10 +158,17 @@ pub(crate) fn command_definition<'a>() -> clap::Command<'a> { .takes_value(true) .help("milliseconds to wait between output lines (for easier reading)"), ) + .arg( + clap::Arg::new("terminal-width") + .long("terminal-width") + .takes_value(true) + .help("width of the terminal"), + ) .arg( clap::Arg::new("mode") .long("mode") .takes_value(true) .possible_values(&["node", "client"]), ) + } diff --git a/src/sinks/terminal/format.rs b/src/sinks/terminal/format.rs index 399c8a0e..b7043130 100644 --- a/src/sinks/terminal/format.rs +++ b/src/sinks/terminal/format.rs @@ -391,9 +391,17 @@ impl Display for LogLine { match self.content.len() { x if x > max_width => { - let partial: String = self.content.chars().take(max_width - 3).collect(); - partial.with(Color::Grey).fmt(f)?; - f.write_str("...")?; + let wrapped: String = self.content + .chars() + .enumerate() + .fold(String::new(), |acc, (i, c)| { + if i != 0 && i % max_width == 0 { + format!("{}\n{}", acc, c) + } else { + format!("{}{}", acc, c) + } + }); + wrapped.with(Color::Grey).fmt(f)?; } _ => { let full = &self.content[..]; diff --git a/src/sinks/terminal/run.rs b/src/sinks/terminal/run.rs index f07696d3..c537841e 100644 --- a/src/sinks/terminal/run.rs +++ b/src/sinks/terminal/run.rs @@ -15,6 +15,7 @@ use super::format::*; pub fn reducer_loop( throttle_min_span: Duration, + terminal_width: Option, input: StageReceiver, utils: Arc, ) -> Result<(), Error> { @@ -27,7 +28,11 @@ pub fn reducer_loop( ))?; for evt in input.iter() { - let (width, _) = crossterm::terminal::size()?; + + let width = match terminal_width { + Some(w) => w, + None => crossterm::terminal::size()?.0 + }; throttle.wait_turn(); let line = LogLine::new(&evt, width as usize, &utils); diff --git a/src/sinks/terminal/setup.rs b/src/sinks/terminal/setup.rs index a757d9e9..c51671ac 100644 --- a/src/sinks/terminal/setup.rs +++ b/src/sinks/terminal/setup.rs @@ -14,6 +14,7 @@ const THROTTLE_MIN_SPAN_MILLIS: u64 = 300; #[derive(Default, Debug, Deserialize)] pub struct Config { pub throttle_min_span_millis: Option, + pub terminal_width: Option } impl SinkProvider for WithUtils { @@ -24,10 +25,12 @@ impl SinkProvider for WithUtils { .unwrap_or(THROTTLE_MIN_SPAN_MILLIS), ); + let terminal_width = self.inner.terminal_width; + let utils = self.utils.clone(); let handle = std::thread::spawn(move || { - reducer_loop(throttle_min_span, input, utils).expect("terminal sink loop failed"); + reducer_loop(throttle_min_span, terminal_width, input, utils).expect("terminal sink loop failed"); }); Ok(handle)