diff --git a/Cargo.lock b/Cargo.lock index e0bf6be..614317a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,18 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "ahash" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "1.0.1" @@ -11,6 +23,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" + [[package]] name = "anstream" version = "0.3.1" @@ -78,6 +96,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" + [[package]] name = "cassowary" version = "0.3.0" @@ -115,7 +139,7 @@ checksum = "0fdc5d93c358224b4d6867ef1356d740de2303e9892edc06c5340daeccd96bab" dependencies = [ "anstream", "anstyle", - "bitflags", + "bitflags 1.3.2", "clap_lex", "strsim", ] @@ -129,7 +153,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.43", ] [[package]] @@ -146,27 +170,11 @@ checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "crossterm" -version = "0.25.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64e6c0fbe2c17357405f7c758c1ef960fce08bdfb2c03d88d2a18d7e09c4b67" +checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df" dependencies = [ - "bitflags", - "crossterm_winapi", - "libc", - "mio", - "parking_lot", - "signal-hook", - "signal-hook-mio", - "winapi", -] - -[[package]] -name = "crossterm" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a84cda67535339806297f1b331d6dd6320470d2a0fe65381e79ee9e156dd3d13" -dependencies = [ - "bitflags", + "bitflags 2.4.1", "crossterm_winapi", "filedescriptor", "libc", @@ -179,9 +187,9 @@ dependencies = [ [[package]] name = "crossterm_winapi" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ae1b35a484aa10e07fe0638d02301c5ad24de82d310ccbd2f3693da5f09bf1c" +checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" dependencies = [ "winapi", ] @@ -213,7 +221,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1e32aa93b952410d55c1ae03048cc22a6cc62a323711b8e9245ef4b5578051c" dependencies = [ - "bitflags", + "bitflags 1.3.2", "csv", "csv-core", "memchr", @@ -226,15 +234,20 @@ version = "0.4.0" dependencies = [ "anyhow", "clap", - "crossterm 0.25.0", - "crossterm 0.26.1", + "crossterm", "csv", "csv-sniffer", + "ratatui", "regex", "tempfile", - "tui", ] +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" + [[package]] name = "errno" version = "0.3.1" @@ -276,11 +289,21 @@ dependencies = [ "winapi", ] +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +dependencies = [ + "ahash", + "allocator-api2", +] + [[package]] name = "heck" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" @@ -288,6 +311,12 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" +[[package]] +name = "indoc" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e186cfbae8084e513daff4240b4797e342f988cecda4fb6c939150f96315fd8" + [[package]] name = "instant" version = "0.1.12" @@ -319,6 +348,15 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "itertools" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.6" @@ -356,6 +394,15 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "lru" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2994eeba8ed550fd9b47a0b38f0242bc3344e496483c6180b69139cc2fa5d1d7" +dependencies = [ + "hashbrown", +] + [[package]] name = "memchr" version = "2.5.0" @@ -403,31 +450,56 @@ dependencies = [ "windows-sys 0.36.1", ] +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "75cb1540fadbd5b8fbccc4dddad2734eba435053f725621c070711a14bb5f4b8" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.26" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] +[[package]] +name = "ratatui" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5659e52e4ba6e07b2dad9f1158f578ef84a73762625ddb51536019f34d180eb" +dependencies = [ + "bitflags 2.4.1", + "cassowary", + "crossterm", + "indoc", + "itertools", + "lru", + "paste", + "stability", + "strum", + "unicode-segmentation", + "unicode-width", +] + [[package]] name = "redox_syscall" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8380fe0152551244f0747b1bf41737e0f8a74f97a14ccefd1148187271634f3c" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -436,7 +508,7 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -462,7 +534,7 @@ version = "0.37.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62b24138615de35e32031d041a09032ef3487a616d901ca4db224e7d557efae2" dependencies = [ - "bitflags", + "bitflags 1.3.2", "errno", "io-lifetimes", "libc", @@ -470,6 +542,12 @@ dependencies = [ "windows-sys 0.45.0", ] +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + [[package]] name = "ryu" version = "1.0.9" @@ -490,9 +568,9 @@ checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" [[package]] name = "signal-hook" -version = "0.3.14" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a253b5e89e2698464fc26b545c9edceb338e18a89effeeecfea192c3025be29d" +checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" dependencies = [ "libc", "signal-hook-registry", @@ -524,12 +602,44 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1" +[[package]] +name = "stability" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebd1b177894da2a2d9120208c3386066af06a488255caabc5de8ddca22dbc3ce" +dependencies = [ + "quote", + "syn 1.0.89", +] + [[package]] name = "strsim" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.43", +] + [[package]] name = "syn" version = "1.0.89" @@ -543,9 +653,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.15" +version = "2.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +checksum = "ee659fb5f3d355364e1f3e5bc10fb82068efbf824a1e9d1c9504244a6469ad53" dependencies = [ "proc-macro2", "quote", @@ -585,19 +695,6 @@ dependencies = [ "syn 1.0.89", ] -[[package]] -name = "tui" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccdd26cbd674007e649a272da4475fb666d3aa0ad0531da7136db6fab0e5bad1" -dependencies = [ - "bitflags", - "cassowary", - "crossterm 0.25.0", - "unicode-segmentation", - "unicode-width", -] - [[package]] name = "unicode-ident" version = "1.0.6" @@ -606,9 +703,9 @@ checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" [[package]] name = "unicode-segmentation" -version = "1.9.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" [[package]] name = "unicode-width" @@ -628,6 +725,12 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -830,3 +933,23 @@ name = "windows_x86_64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "zerocopy" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.43", +] diff --git a/Cargo.toml b/Cargo.toml index b5b34b3..0079429 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,8 +15,8 @@ edition = "2021" [dependencies] csv = "1.2" -tui = "0.19" -crossterm = { version = "0.26.1", features = ["use-dev-tty"] } +ratatui = "0.25.0" +crossterm = { version = "0.27.0", features = ["use-dev-tty"] } anyhow = "1.0" clap = { version = "4.2", features = ["derive"] } tempfile = "3.5" @@ -24,7 +24,7 @@ regex = "1.8" csv-sniffer = "0.3.1" [target.'cfg(windows)'.dependencies] -crossterm = "0.25" +crossterm = "0.27.0" # The profile that 'cargo dist' will build with [profile.dist] diff --git a/src/app.rs b/src/app.rs index d01d8ed..d66ccd4 100644 --- a/src/app.rs +++ b/src/app.rs @@ -9,8 +9,8 @@ use crate::ui::{CsvTable, CsvTableState, FilterColumnsState, FinderState}; use crate::view; use anyhow::ensure; -use tui::backend::Backend; -use tui::{Frame, Terminal}; +use ratatui::backend::Backend; +use ratatui::{Frame, Terminal}; use anyhow::{Context, Result}; use regex::Regex; @@ -532,7 +532,7 @@ impl App { } } - fn render_frame(&mut self, f: &mut Frame) { + fn render_frame(&mut self, f: &mut Frame) { let size = f.size(); // Render help; if so exit early. @@ -573,16 +573,16 @@ mod tests { use std::thread; use super::*; - use tui::backend::TestBackend; - use tui::buffer::Buffer; + use ratatui::backend::TestBackend; + use ratatui::buffer::Buffer; fn to_lines(buf: &Buffer) -> Vec { let mut symbols: String = "".to_owned(); let area = buf.area(); for y in 0..area.bottom() { for x in 0..area.right() { - let symbol = buf.get(x, y).symbol.clone(); - symbols.push_str(&symbol); + let symbol = buf.get(x, y).symbol(); + symbols.push_str(symbol); } if y != area.bottom() - 1 { symbols.push('\n'); diff --git a/src/help.rs b/src/help.rs index 9242e5c..0b6beca 100644 --- a/src/help.rs +++ b/src/help.rs @@ -1,8 +1,8 @@ -use tui::{ +use ratatui::{ buffer::Buffer, layout::Rect, style::{Color, Modifier, Style}, - text::{Span, Spans}, + text::{Line, Span}, widgets::{Block, Borders, Paragraph, StatefulWidget, Widget, Wrap}, }; @@ -118,9 +118,9 @@ impl StatefulWidget for HelpPage { } } - let text: Vec = HELP_CONTENT + let text: Vec = HELP_CONTENT .split('\n') - .map(|s| Spans::from(line_to_span(s))) + .map(|s| Line::from(line_to_span(s))) .collect(); // Minus 2 to account for borders. diff --git a/src/main.rs b/src/main.rs index ea742fa..05f965d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -20,13 +20,13 @@ use crossterm::execute; use crossterm::terminal::{ disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen, }; +use ratatui::backend::CrosstermBackend; +use ratatui::Terminal; use std::fs::File; use std::io::{self, Read, Seek, SeekFrom, Write}; use std::panic; use std::thread::panicking; use tempfile::NamedTempFile; -use tui::backend::CrosstermBackend; -use tui::Terminal; struct SeekableFile { filename: Option, diff --git a/src/ui.rs b/src/ui.rs index a139a10..40be401 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -4,14 +4,14 @@ use crate::input::InputMode; use crate::view; use crate::view::Header; use crate::wrap; +use ratatui::buffer::Buffer; +use ratatui::layout::Rect; +use ratatui::style::{Color, Modifier, Style}; +use ratatui::symbols::line; +use ratatui::text::{Line, Span}; +use ratatui::widgets::Widget; +use ratatui::widgets::{Block, Borders, StatefulWidget}; use regex::Regex; -use tui::buffer::Buffer; -use tui::layout::Rect; -use tui::style::{Color, Modifier, Style}; -use tui::symbols::line; -use tui::text::{Span, Spans}; -use tui::widgets::Widget; -use tui::widgets::{Block, Borders, StatefulWidget}; use std::cmp::{max, min}; use std::collections::HashMap; @@ -457,32 +457,31 @@ impl<'a> CsvTable<'a> { NUM_SPACES_BETWEEN_COLUMNS } as usize; - let mut spans_wrapper = wrap::SpansWrapper::new(spans, effective_width as usize); + let mut line_wrapper = wrap::LineWrapper::new(spans, effective_width as usize); for offset in 0..height { - if let Some(mut spans) = spans_wrapper.next() { + if let Some(mut line) = line_wrapper.next() { // There is some content to render. Truncate with ... if there is no more vertical // space available. - if offset == height - 1 && !spans_wrapper.finished() { - if let Some(last_span) = spans.0.pop() { + if offset == height - 1 && !line_wrapper.finished() { + if let Some(last_span) = line.spans.pop() { let truncate_length = last_span.width().saturating_sub(SUFFIX_LEN as usize); let truncated_content: String = last_span.content.chars().take(truncate_length).collect(); let truncated_span = Span::styled(truncated_content, last_span.style); - spans.0.push(truncated_span); - spans.0.push(Span::styled(SUFFIX, last_span.style)); + line.spans.push(truncated_span); + line.spans.push(Span::styled(SUFFIX, last_span.style)); } } let padding_width = min( - (effective_width as usize).saturating_sub(spans.width()) + buffer_space, + (effective_width as usize).saturating_sub(line.width()) + buffer_space, width as usize, ); if padding_width > 0 { - spans - .0 + line.spans .push(Span::styled(" ".repeat(padding_width), filler_style.style)); } - buf.set_spans(x, y + offset, &spans, width); + buf.set_line(x, y + offset, &line, width); } else { // There are extra vertical spaces that are just empty lines. Fill them with the // correct style. @@ -491,7 +490,7 @@ impl<'a> CsvTable<'a> { // It's possible that no spans are yielded due to insufficient remaining width. // Render ... in this case. - if !spans_wrapper.finished() { + if !line_wrapper.finished() { let truncated_content: String = content .chars() .take(content.len().saturating_sub(1)) @@ -499,7 +498,7 @@ impl<'a> CsvTable<'a> { content = format!("{SUFFIX}{}", truncated_content.as_str()); } let span = Span::styled(content, filler_style.style); - buf.set_spans(x, y + offset, &Spans::from(vec![span]), width); + buf.set_line(x, y + offset, &Line::from(vec![span]), width); } } } diff --git a/src/util/events.rs b/src/util/events.rs index 6042702..0c9bf5c 100644 --- a/src/util/events.rs +++ b/src/util/events.rs @@ -1,9 +1,6 @@ use std::time::{Duration, Instant}; -use crossterm::{ - event::{poll, read, Event, KeyCode, KeyEvent}, - ErrorKind, -}; +use crossterm::event::{poll, read, Event, KeyCode, KeyEvent, KeyEventKind}; pub enum CsvlensEvent { Input(I), @@ -42,19 +39,20 @@ impl CsvlensEvents { } } - pub fn next(&self) -> Result, ErrorKind> { + pub fn next(&self) -> std::io::Result> { let now = Instant::now(); match poll(self.tick_rate) { - Ok(true) => { - if let Event::Key(event) = read()? { + Ok(true) => match read()? { + Event::Key(event) if event.kind == KeyEventKind::Press => { Ok(CsvlensEvent::Input(event)) - } else { + } + _ => { let time_spent = now.elapsed(); let rest = self.tick_rate - time_spent; Self { tick_rate: rest }.next() } - } + }, Ok(false) => Ok(CsvlensEvent::Tick), Err(_) => todo!(), } diff --git a/src/wrap.rs b/src/wrap.rs index 1e0ad29..1f85275 100644 --- a/src/wrap.rs +++ b/src/wrap.rs @@ -1,15 +1,15 @@ -use tui::text::{Span, Spans}; +use ratatui::text::{Line, Span}; -pub struct SpansWrapper<'a> { +pub struct LineWrapper<'a> { spans: &'a [Span<'a>], max_width: usize, index: usize, pending: Option>, } -impl<'a> SpansWrapper<'a> { +impl<'a> LineWrapper<'a> { pub fn new(spans: &'a [Span<'a>], max_width: usize) -> Self { - SpansWrapper { + LineWrapper { spans, max_width, index: 0, @@ -17,7 +17,7 @@ impl<'a> SpansWrapper<'a> { } } - pub fn next(&mut self) -> Option> { + pub fn next(&mut self) -> Option> { let mut out_spans = vec![]; let mut remaining_width = self.max_width; loop { @@ -70,7 +70,7 @@ impl<'a> SpansWrapper<'a> { if out_spans.is_empty() { return None; } - Some(Spans::from(out_spans)) + Some(Line::from(out_spans)) } pub fn finished(&self) -> bool { @@ -82,14 +82,14 @@ impl<'a> SpansWrapper<'a> { mod tests { use super::*; - use tui::style::{Color, Style}; + use ratatui::style::{Color, Style}; #[test] fn test_no_wrapping() { let s = Span::raw("hello"); let spans = vec![s.clone()]; - let mut wrapper = SpansWrapper::new(&spans, 10); - assert_eq!(wrapper.next(), Some(Spans::from(vec![s.clone()]))); + let mut wrapper = LineWrapper::new(&spans, 10); + assert_eq!(wrapper.next(), Some(Line::from(vec![s.clone()]))); assert_eq!(wrapper.next(), None); } @@ -97,10 +97,10 @@ mod tests { fn test_with_wrapping() { let s = Span::raw("hello"); let spans = vec![s.clone()]; - let mut wrapper = SpansWrapper::new(&spans, 2); - assert_eq!(wrapper.next(), Some(Spans::from(vec![Span::raw("he")]))); - assert_eq!(wrapper.next(), Some(Spans::from(vec![Span::raw("ll")]))); - assert_eq!(wrapper.next(), Some(Spans::from(vec![Span::raw("o")]))); + let mut wrapper = LineWrapper::new(&spans, 2); + assert_eq!(wrapper.next(), Some(Line::from(vec![Span::raw("he")]))); + assert_eq!(wrapper.next(), Some(Line::from(vec![Span::raw("ll")]))); + assert_eq!(wrapper.next(), Some(Line::from(vec![Span::raw("o")]))); assert_eq!(wrapper.next(), None); } @@ -108,9 +108,9 @@ mod tests { fn test_new_lines_before_max_width() { let s = Span::raw("hello\nworld"); let spans = vec![s.clone()]; - let mut wrapper = SpansWrapper::new(&spans, 10); - assert_eq!(wrapper.next(), Some(Spans::from(vec![Span::raw("hello")]))); - assert_eq!(wrapper.next(), Some(Spans::from(vec![Span::raw("world")]))); + let mut wrapper = LineWrapper::new(&spans, 10); + assert_eq!(wrapper.next(), Some(Line::from(vec![Span::raw("hello")]))); + assert_eq!(wrapper.next(), Some(Line::from(vec![Span::raw("world")]))); assert_eq!(wrapper.next(), None); } @@ -118,11 +118,11 @@ mod tests { fn test_new_lines_after_max_width() { let s = Span::raw("hello\nworld"); let spans = vec![s.clone()]; - let mut wrapper = SpansWrapper::new(&spans, 3); - assert_eq!(wrapper.next(), Some(Spans::from(vec![Span::raw("hel")]))); - assert_eq!(wrapper.next(), Some(Spans::from(vec![Span::raw("lo")]))); - assert_eq!(wrapper.next(), Some(Spans::from(vec![Span::raw("wor")]))); - assert_eq!(wrapper.next(), Some(Spans::from(vec![Span::raw("ld")]))); + let mut wrapper = LineWrapper::new(&spans, 3); + assert_eq!(wrapper.next(), Some(Line::from(vec![Span::raw("hel")]))); + assert_eq!(wrapper.next(), Some(Line::from(vec![Span::raw("lo")]))); + assert_eq!(wrapper.next(), Some(Line::from(vec![Span::raw("wor")]))); + assert_eq!(wrapper.next(), Some(Line::from(vec![Span::raw("ld")]))); assert_eq!(wrapper.next(), None); } @@ -134,16 +134,16 @@ mod tests { Span::styled("my", style), Span::raw("world"), ]; - let mut wrapper = SpansWrapper::new(&spans, 5); - assert_eq!(wrapper.next(), Some(Spans::from(vec![Span::raw("hello")]))); + let mut wrapper = LineWrapper::new(&spans, 5); + assert_eq!(wrapper.next(), Some(Line::from(vec![Span::raw("hello")]))); assert_eq!( wrapper.next(), - Some(Spans::from(vec![ + Some(Line::from(vec![ Span::styled("my", style), Span::raw("wor") ])) ); - assert_eq!(wrapper.next(), Some(Spans::from(vec![Span::raw("ld")]))); + assert_eq!(wrapper.next(), Some(Line::from(vec![Span::raw("ld")]))); assert_eq!(wrapper.next(), None); } @@ -155,20 +155,20 @@ mod tests { Span::styled("m\ny", style), Span::raw("world"), ]; - let mut wrapper = SpansWrapper::new(&spans, 5); - assert_eq!(wrapper.next(), Some(Spans::from(vec![Span::raw("hello")]))); + let mut wrapper = LineWrapper::new(&spans, 5); + assert_eq!(wrapper.next(), Some(Line::from(vec![Span::raw("hello")]))); assert_eq!( wrapper.next(), - Some(Spans::from(vec![Span::styled("m", style)])) + Some(Line::from(vec![Span::styled("m", style)])) ); assert_eq!( wrapper.next(), - Some(Spans::from(vec![ + Some(Line::from(vec![ Span::styled("y", style), Span::raw("worl") ])) ); - assert_eq!(wrapper.next(), Some(Spans::from(vec![Span::raw("d")]))); + assert_eq!(wrapper.next(), Some(Line::from(vec![Span::raw("d")]))); assert_eq!(wrapper.next(), None); } @@ -176,10 +176,10 @@ mod tests { fn test_unicode() { let s = Span::raw("héllo"); let spans = vec![s.clone()]; - let mut wrapper = SpansWrapper::new(&spans, 2); - assert_eq!(wrapper.next(), Some(Spans::from(vec![Span::raw("hé")]))); - assert_eq!(wrapper.next(), Some(Spans::from(vec![Span::raw("ll")]))); - assert_eq!(wrapper.next(), Some(Spans::from(vec![Span::raw("o")]))); + let mut wrapper = LineWrapper::new(&spans, 2); + assert_eq!(wrapper.next(), Some(Line::from(vec![Span::raw("hé")]))); + assert_eq!(wrapper.next(), Some(Line::from(vec![Span::raw("ll")]))); + assert_eq!(wrapper.next(), Some(Line::from(vec![Span::raw("o")]))); assert_eq!(wrapper.next(), None); } }