diff --git a/Cargo.lock b/Cargo.lock index 995ee36..fbcfb12 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3094,7 +3094,7 @@ dependencies = [ [[package]] name = "television" -version = "0.3.13" +version = "0.4.13" dependencies = [ "anyhow", "bat", @@ -3126,8 +3126,11 @@ dependencies = [ "strip-ansi-escapes", "strum", "syntect", + "television-channels", "television-derive", "television-fuzzy", + "television-previewers", + "television-utils", "termtree", "tokio", "toml", @@ -3138,9 +3141,28 @@ dependencies = [ "vergen-gix", ] +[[package]] +name = "television-channels" +version = "0.0.0" +dependencies = [ + "clap", + "color-eyre", + "devicons", + "directories", + "eyre", + "ignore", + "serde", + "strum", + "television-derive", + "television-fuzzy", + "television-utils", + "tokio", + "tracing", +] + [[package]] name = "television-derive" -version = "0.1.2" +version = "0.0.0" dependencies = [ "proc-macro2", "quote", @@ -3149,12 +3171,42 @@ dependencies = [ [[package]] name = "television-fuzzy" -version = "0.1.1" +version = "0.0.0" dependencies = [ "nucleo", "parking_lot", ] +[[package]] +name = "television-previewers" +version = "0.0.0" +dependencies = [ + "color-eyre", + "devicons", + "infer", + "parking_lot", + "syntect", + "television-channels", + "television-utils", + "termtree", + "tokio", + "tracing", +] + +[[package]] +name = "television-utils" +version = "0.0.0" +dependencies = [ + "bat", + "color-eyre", + "directories", + "ignore", + "infer", + "lazy_static", + "syntect", + "tracing", +] + [[package]] name = "tempfile" version = "3.14.0" diff --git a/Cargo.toml b/Cargo.toml index 60fedfe..29dc0f8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "television" -version = "0.3.13" +version = "0.4.13" edition = "2021" description = "The revolution will be televised." license = "MIT" @@ -22,11 +22,14 @@ path = "crates/television/main.rs" name = "tv" [workspace] -members = ["crates/television_derive", "crates/television_fuzzy"] +members = ["crates/television_channels","crates/television_derive", "crates/television_fuzzy", "crates/television_previewers", "crates/television_utils"] [dependencies] -television-fuzzy = { version = "0.1.1", path = "crates/television_fuzzy" } -television-derive = { version = "0.1.2", path = "crates/television_derive" } +television-fuzzy = { version = "0.0.0", path = "crates/television_fuzzy" } +television-derive = { version = "0.0.0", path = "crates/television_derive" } +television-channels = { version = "0.0.0", path = "crates/television_channels" } +television-previewers = { version = "0.0.0", path = "crates/television_previewers" } +television-utils = { version = "0.0.0", path = "crates/television_utils" } better-panic = "0.3.0" clap = { version = "4.4.5", features = [ "derive", diff --git a/crates/television/app.rs b/crates/television/app.rs index 5054aac..d668cce 100644 --- a/crates/television/app.rs +++ b/crates/television/app.rs @@ -4,15 +4,15 @@ use color_eyre::Result; use tokio::sync::{mpsc, Mutex}; use tracing::{debug, info}; -use crate::channels::TelevisionChannel; use crate::television::{Mode, Television}; use crate::{ action::Action, config::Config, - entry::Entry, event::{Event, EventLoop, Key}, render::{render, RenderingTask}, }; +use television_channels::channels::TelevisionChannel; +use television_channels::entry::Entry; /// The main application struct that holds the state of the application. pub struct App { diff --git a/crates/television/cli.rs b/crates/television/cli.rs index cb06579..f450ac7 100644 --- a/crates/television/cli.rs +++ b/crates/television/cli.rs @@ -1,7 +1,7 @@ use clap::Parser; -use crate::channels::CliTvChannel; use crate::config::{get_config_dir, get_data_dir}; +use television_channels::channels::CliTvChannel; #[derive(Parser, Debug)] #[command(author, version = version(), about)] diff --git a/crates/television/config.rs b/crates/television/config.rs index 1338088..95369ac 100644 --- a/crates/television/config.rs +++ b/crates/television/config.rs @@ -1,5 +1,10 @@ -use std::{collections::HashMap, env, num::NonZeroUsize, path::PathBuf}; +use std::{collections::HashMap, env, path::PathBuf}; +use crate::{ + action::Action, + event::{convert_raw_event_to_key, Key}, + television::Mode, +}; use color_eyre::Result; use crossterm::event::{KeyCode, KeyEvent, KeyModifiers}; use derive_deref::{Deref, DerefMut}; @@ -7,15 +12,9 @@ use directories::ProjectDirs; use lazy_static::lazy_static; use ratatui::style::{Color, Modifier, Style}; use serde::{de::Deserializer, Deserialize}; +use television_previewers::previewers::{self, PreviewerConfig}; use tracing::{info, warn}; -use crate::{ - action::Action, - event::{convert_raw_event_to_key, Key}, - previewers::{self, PreviewerConfig}, - television::Mode, -}; - const CONFIG: &str = include_str!("../../.config/config.toml"); #[allow(dead_code, clippy::module_name_repetitions)] @@ -373,17 +372,6 @@ pub fn parse_key(raw: &str) -> Result { Ok(convert_raw_event_to_key(key_event)) } -pub fn default_num_threads() -> NonZeroUsize { - // default to 1 thread if we can't determine the number of available threads - let default = NonZeroUsize::MIN; - // never use more than 32 threads to avoid startup overhead - let limit = NonZeroUsize::new(32).unwrap(); - - std::thread::available_parallelism() - .unwrap_or(default) - .min(limit) -} - #[derive(Clone, Debug, Default, Deref, DerefMut)] pub struct Styles(pub HashMap>); diff --git a/crates/television/main.rs b/crates/television/main.rs index 9921e44..90878ee 100644 --- a/crates/television/main.rs +++ b/crates/television/main.rs @@ -1,31 +1,27 @@ use std::io::{stdout, IsTerminal, Write}; -use channels::TelevisionChannel; use clap::Parser; use color_eyre::Result; +use television_channels::channels::TelevisionChannel; use tracing::{debug, info}; use crate::app::App; -use crate::channels::stdin::Channel as StdinChannel; use crate::cli::Cli; -use crate::utils::is_readable_stdin; +use television_channels::channels::stdin::Channel as StdinChannel; +use television_utils::utils::is_readable_stdin; pub mod action; pub mod app; -pub mod channels; pub mod cli; pub mod config; -pub mod entry; pub mod errors; pub mod event; pub mod logging; pub mod picker; -pub mod previewers; pub mod render; pub mod television; pub mod tui; pub mod ui; -pub mod utils; #[tokio::main(flavor = "multi_thread")] async fn main() -> Result<()> { diff --git a/crates/television/picker.rs b/crates/television/picker.rs index 1157d86..78f1908 100644 --- a/crates/television/picker.rs +++ b/crates/television/picker.rs @@ -1,6 +1,6 @@ use crate::ui::input::Input; -use crate::utils::strings::EMPTY_STRING; use ratatui::widgets::ListState; +use television_utils::utils::strings::EMPTY_STRING; #[derive(Debug)] pub struct Picker { diff --git a/crates/television/television.rs b/crates/television/television.rs index 60837ea..fffb4c6 100644 --- a/crates/television/television.rs +++ b/crates/television/television.rs @@ -1,18 +1,9 @@ -use crate::channels::remote_control::RemoteControl; -use crate::channels::{OnAir, UnitChannel}; use crate::picker::Picker; -use crate::previewers; +use crate::ui::input::actions::InputActionHandler; use crate::ui::layout::{Dimensions, Layout}; -use crate::utils::strings::EMPTY_STRING; +use crate::ui::spinner::Spinner; +use crate::ui::spinner::SpinnerState; use crate::{action::Action, config::Config}; -use crate::{ - channels::TelevisionChannel, ui::input::actions::InputActionHandler, -}; -use crate::{ - entry::{Entry, ENTRY_PLACEHOLDER}, - ui::spinner::Spinner, -}; -use crate::{previewers::Previewer, ui::spinner::SpinnerState}; use color_eyre::Result; use copypasta::{ClipboardContext, ClipboardProvider}; use futures::executor::block_on; @@ -20,6 +11,13 @@ use ratatui::{layout::Rect, style::Color, widgets::Paragraph, Frame}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use strum::Display; +use television_channels::channels::{ + remote_control::RemoteControl, OnAir, TelevisionChannel, UnitChannel, +}; +use television_channels::entry::{Entry, ENTRY_PLACEHOLDER}; +use television_previewers::previewers; +use television_previewers::previewers::Previewer; +use television_utils::utils::strings::EMPTY_STRING; use tokio::sync::mpsc::UnboundedSender; #[derive( diff --git a/crates/television/ui/input.rs b/crates/television/ui/input.rs index 7c3f978..d1a2639 100644 --- a/crates/television/ui/input.rs +++ b/crates/television/ui/input.rs @@ -1,4 +1,3 @@ -use crate::channels::OnAir; use crate::television::Television; use crate::ui::layout::Layout; use crate::ui::BORDER_COLOR; @@ -11,6 +10,7 @@ use ratatui::style::Stylize; use ratatui::text::Line; use ratatui::widgets::{Block, BorderType, Borders, Paragraph}; use ratatui::Frame; +use television_channels::channels::OnAir; pub mod actions; pub mod backend; diff --git a/crates/television/ui/preview.rs b/crates/television/ui/preview.rs index 75906bb..ff95ebd 100644 --- a/crates/television/ui/preview.rs +++ b/crates/television/ui/preview.rs @@ -1,12 +1,6 @@ -use crate::channels::OnAir; -use crate::entry::Entry; -use crate::previewers::{ - Preview, PreviewContent, FILE_TOO_LARGE_MSG, PREVIEW_NOT_SUPPORTED_MSG, -}; use crate::television::Television; use crate::ui::layout::Layout; use crate::ui::BORDER_COLOR; -use crate::utils::strings::{shrink_with_ellipsis, EMPTY_STRING}; use color_eyre::eyre::Result; use ratatui::layout::{Alignment, Rect}; use ratatui::prelude::{Color, Line, Modifier, Span, Style, Stylize, Text}; @@ -15,6 +9,12 @@ use ratatui::Frame; use std::str::FromStr; use std::sync::Arc; use syntect::highlighting::Color as SyntectColor; +use television_channels::channels::OnAir; +use television_channels::entry::Entry; +use television_previewers::previewers::{ + Preview, PreviewContent, FILE_TOO_LARGE_MSG, PREVIEW_NOT_SUPPORTED_MSG, +}; +use television_utils::utils::strings::{shrink_with_ellipsis, EMPTY_STRING}; // preview pub const DEFAULT_PREVIEW_TITLE_FG: Color = Color::Blue; diff --git a/crates/television/ui/remote_control.rs b/crates/television/ui/remote_control.rs index f9c594b..90c0cbc 100644 --- a/crates/television/ui/remote_control.rs +++ b/crates/television/ui/remote_control.rs @@ -1,4 +1,3 @@ -use crate::channels::OnAir; use crate::television::Television; use crate::ui::logo::build_remote_logo_paragraph; use crate::ui::mode::mode_color; @@ -13,6 +12,7 @@ use ratatui::widgets::{ Block, BorderType, Borders, ListDirection, Padding, Paragraph, }; use ratatui::Frame; +use television_channels::channels::OnAir; impl Television { pub fn draw_remote_control( diff --git a/crates/television/ui/results.rs b/crates/television/ui/results.rs index a54ae09..ee43116 100644 --- a/crates/television/ui/results.rs +++ b/crates/television/ui/results.rs @@ -1,9 +1,6 @@ -use crate::channels::OnAir; -use crate::entry::Entry; use crate::television::Television; use crate::ui::layout::Layout; use crate::ui::BORDER_COLOR; -use crate::utils::strings::{next_char_boundary, slice_at_char_boundaries}; use color_eyre::eyre::Result; use ratatui::layout::Alignment; use ratatui::prelude::{Color, Line, Span, Style}; @@ -12,6 +9,11 @@ use ratatui::widgets::{ }; use ratatui::Frame; use std::str::FromStr; +use television_channels::channels::OnAir; +use television_channels::entry::Entry; +use television_utils::utils::strings::{ + next_char_boundary, slice_at_char_boundaries, +}; // Styles const DEFAULT_RESULT_NAME_FG: Color = Color::Blue; diff --git a/crates/television_channels/Cargo.toml b/crates/television_channels/Cargo.toml new file mode 100644 index 0000000..4c7cdd0 --- /dev/null +++ b/crates/television_channels/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "television-channels" +version = "0.0.0" +edition = "2021" + +[dependencies] +television-fuzzy = { path = "../television_fuzzy", version = "0.0.0" } +television-utils = { path = "../television_utils", version = "0.0.0" } +television-derive = { path = "../television_derive", version = "0.0.0" } +devicons = "0.6.11" +tracing = "0.1.40" +eyre = "0.6.12" +ignore = "0.4.23" +tokio = { version = "1.41.1", features = ["rt"] } +clap = { version = "4.5.20", features = ["derive"] } +directories = "5.0.1" +color-eyre = "0.6.3" +serde = "1.0.214" +strum = { version = "0.26.3", features = ["derive"] } diff --git a/crates/television/channels.rs b/crates/television_channels/src/channels.rs similarity index 98% rename from crates/television/channels.rs rename to crates/television_channels/src/channels.rs index 3c99169..e1cff1f 100644 --- a/crates/television/channels.rs +++ b/crates/television_channels/src/channels.rs @@ -23,7 +23,7 @@ mod text; /// return anything and instead typically stores the results internally for /// later retrieval allowing to perform the search in the background while /// incrementally polling the results. -/// ```rust +/// ```ignore /// fn find(&mut self, pattern: &str); /// ``` /// - `results`: Get the results of the search (at a given point in time, see @@ -31,20 +31,20 @@ mod text; /// search pattern. The `num_entries` parameter specifies the number of /// entries to return and the `offset` parameter specifies the starting index /// of the entries to return. -/// ```rust +/// ```ignore /// fn results(&mut self, num_entries: u32, offset: u32) -> Vec; /// ``` /// - `get_result`: Get a specific result by its index. -/// ```rust +/// ```ignore /// fn get_result(&self, index: u32) -> Option; /// ``` /// - `result_count`: Get the number of results currently available. -/// ```rust +/// ```ignore /// fn result_count(&self) -> u32; /// ``` /// - `total_count`: Get the total number of entries currently available (e.g. /// the haystack). -/// ```rust +/// ```ignore /// fn total_count(&self) -> u32; /// ``` /// @@ -195,7 +195,7 @@ macro_rules! variant_to_module { /// # Example /// The following example defines transitions from the `Files` channel to the `Text` /// channel and from the `GitRepos` channel to the `Files` and `Text` channels. -/// ```rust +/// ```ignore /// define_transitions! { /// // The `Files` channel can transition to the `Text` channel. /// Files => [Text], @@ -204,7 +204,7 @@ macro_rules! variant_to_module { /// } /// ``` /// This will generate the following methods for the `TelevisionChannel` enum: -/// ```rust +/// ```ignore /// impl TelevisionChannel { /// pub fn available_transitions(&self) -> Vec { /// match self { diff --git a/crates/television/channels/alias.rs b/crates/television_channels/src/channels/alias.rs similarity index 96% rename from crates/television/channels/alias.rs rename to crates/television_channels/src/channels/alias.rs index 74f0d3b..14c3edd 100644 --- a/crates/television/channels/alias.rs +++ b/crates/television_channels/src/channels/alias.rs @@ -1,10 +1,10 @@ use crate::channels::OnAir; use crate::entry::Entry; -use crate::previewers::PreviewType; -use crate::utils::indices::sep_name_and_value_indices; -use crate::utils::strings::preprocess_line; +use crate::entry::PreviewType; use devicons::FileIcon; use television_fuzzy::matcher::{config::Config, injector::Injector, Matcher}; +use television_utils::utils::indices::sep_name_and_value_indices; +use television_utils::utils::strings::preprocess_line; use tracing::debug; #[derive(Debug, Clone)] diff --git a/crates/television/channels/env.rs b/crates/television_channels/src/channels/env.rs similarity index 95% rename from crates/television/channels/env.rs rename to crates/television_channels/src/channels/env.rs index ba5b8f9..412d277 100644 --- a/crates/television/channels/env.rs +++ b/crates/television_channels/src/channels/env.rs @@ -1,11 +1,10 @@ use devicons::FileIcon; use super::OnAir; -use crate::entry::Entry; -use crate::previewers::PreviewType; -use crate::utils::indices::sep_name_and_value_indices; -use crate::utils::strings::preprocess_line; +use crate::entry::{Entry, PreviewType}; use television_fuzzy::matcher::{config::Config, Matcher}; +use television_utils::utils::indices::sep_name_and_value_indices; +use television_utils::utils::strings::preprocess_line; #[derive(Debug, Clone)] struct EnvVar { diff --git a/crates/television/channels/files.rs b/crates/television_channels/src/channels/files.rs similarity index 96% rename from crates/television/channels/files.rs rename to crates/television_channels/src/channels/files.rs index 58b93ec..5e370c1 100644 --- a/crates/television/channels/files.rs +++ b/crates/television_channels/src/channels/files.rs @@ -1,12 +1,11 @@ use crate::channels::{OnAir, TelevisionChannel}; -use crate::entry::Entry; -use crate::previewers::PreviewType; -use crate::utils::files::{walk_builder, DEFAULT_NUM_THREADS}; -use crate::utils::strings::preprocess_line; +use crate::entry::{Entry, PreviewType}; use devicons::FileIcon; use std::collections::HashSet; use std::path::PathBuf; use television_fuzzy::matcher::{config::Config, injector::Injector, Matcher}; +use television_utils::utils::files::{walk_builder, DEFAULT_NUM_THREADS}; +use television_utils::utils::strings::preprocess_line; pub struct Channel { matcher: Matcher, diff --git a/crates/television/channels/git_repos.rs b/crates/television_channels/src/channels/git_repos.rs similarity index 96% rename from crates/television/channels/git_repos.rs rename to crates/television_channels/src/channels/git_repos.rs index c5a547b..1bb92eb 100644 --- a/crates/television/channels/git_repos.rs +++ b/crates/television_channels/src/channels/git_repos.rs @@ -5,15 +5,11 @@ use std::path::PathBuf; use tokio::task::JoinHandle; use tracing::debug; -use crate::{ - entry::Entry, - previewers::PreviewType, - utils::files::{walk_builder, DEFAULT_NUM_THREADS}, -}; - use crate::channels::OnAir; -use crate::utils::strings::preprocess_line; +use crate::entry::{Entry, PreviewType}; use television_fuzzy::matcher::{config::Config, injector::Injector, Matcher}; +use television_utils::utils::files::{walk_builder, DEFAULT_NUM_THREADS}; +use television_utils::utils::strings::preprocess_line; pub struct Channel { matcher: Matcher, diff --git a/crates/television/channels/remote_control.rs b/crates/television_channels/src/channels/remote_control.rs similarity index 93% rename from crates/television/channels/remote_control.rs rename to crates/television_channels/src/channels/remote_control.rs index 08befe4..a767de1 100644 --- a/crates/television/channels/remote_control.rs +++ b/crates/television_channels/src/channels/remote_control.rs @@ -1,9 +1,5 @@ -use crate::channels::{TelevisionChannel, UnitChannel}; -use crate::{ - channels::{CliTvChannel, OnAir}, - entry::Entry, - previewers::PreviewType, -}; +use crate::channels::{CliTvChannel, OnAir, TelevisionChannel, UnitChannel}; +use crate::entry::{Entry, PreviewType}; use clap::ValueEnum; use devicons::FileIcon; use television_fuzzy::matcher::{config::Config, Matcher}; diff --git a/crates/television/channels/stdin.rs b/crates/television_channels/src/channels/stdin.rs similarity index 96% rename from crates/television/channels/stdin.rs rename to crates/television_channels/src/channels/stdin.rs index 3385a88..ea646e3 100644 --- a/crates/television/channels/stdin.rs +++ b/crates/television_channels/src/channels/stdin.rs @@ -4,10 +4,9 @@ use std::path::Path; use devicons::FileIcon; use super::OnAir; -use crate::entry::Entry; -use crate::previewers::PreviewType; -use crate::utils::strings::preprocess_line; +use crate::entry::{Entry, PreviewType}; use television_fuzzy::matcher::{config::Config, Matcher}; +use television_utils::utils::strings::preprocess_line; pub struct Channel { matcher: Matcher, diff --git a/crates/television/channels/text.rs b/crates/television_channels/src/channels/text.rs similarity index 98% rename from crates/television/channels/text.rs rename to crates/television_channels/src/channels/text.rs index 81e96a8..e1ad339 100644 --- a/crates/television/channels/text.rs +++ b/crates/television_channels/src/channels/text.rs @@ -1,13 +1,5 @@ use super::{OnAir, TelevisionChannel}; -use crate::previewers::PreviewType; -use crate::utils::strings::PRINTABLE_ASCII_THRESHOLD; -use crate::utils::{ - files::{is_not_text, walk_builder, DEFAULT_NUM_THREADS}, - strings::preprocess_line, -}; -use crate::{ - entry::Entry, utils::strings::proportion_of_printable_ascii_characters, -}; +use crate::entry::{Entry, PreviewType}; use devicons::FileIcon; use ignore::WalkState; use std::{ @@ -17,6 +9,13 @@ use std::{ sync::{atomic::AtomicUsize, Arc}, }; use television_fuzzy::matcher::{config::Config, injector::Injector, Matcher}; +use television_utils::utils::strings::{ + proportion_of_printable_ascii_characters, PRINTABLE_ASCII_THRESHOLD, +}; +use television_utils::utils::{ + files::{is_not_text, walk_builder, DEFAULT_NUM_THREADS}, + strings::preprocess_line, +}; use tracing::{debug, warn}; #[derive(Debug, Clone)] diff --git a/crates/television/entry.rs b/crates/television_channels/src/entry.rs similarity index 96% rename from crates/television/entry.rs rename to crates/television_channels/src/entry.rs index 4c40e87..088b598 100644 --- a/crates/television/entry.rs +++ b/crates/television_channels/src/entry.rs @@ -1,7 +1,5 @@ use devicons::FileIcon; -use crate::previewers::PreviewType; - // NOTE: having an enum for entry types would be nice since it would allow // having a nicer implementation for transitions between channels. This would // permit implementing `From` for channels which would make the @@ -127,3 +125,12 @@ pub const ENTRY_PLACEHOLDER: Entry = Entry { line_number: None, preview_type: PreviewType::EnvVar, }; + +#[derive(Debug, Clone, Eq, PartialEq, Hash, Default)] +pub enum PreviewType { + #[default] + Basic, + Directory, + EnvVar, + Files, +} diff --git a/crates/television_channels/src/lib.rs b/crates/television_channels/src/lib.rs new file mode 100644 index 0000000..db4042f --- /dev/null +++ b/crates/television_channels/src/lib.rs @@ -0,0 +1,17 @@ +pub mod channels; +pub mod entry; + +pub fn add(left: u64, right: u64) -> u64 { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +} diff --git a/crates/television_derive/Cargo.toml b/crates/television_derive/Cargo.toml index 275c6e2..407512f 100644 --- a/crates/television_derive/Cargo.toml +++ b/crates/television_derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "television-derive" -version = "0.1.2" +version = "0.0.0" edition = "2021" description = "The revolution will be televised." license = "MIT" diff --git a/crates/television_fuzzy/Cargo.toml b/crates/television_fuzzy/Cargo.toml index a4c754e..bee81ae 100644 --- a/crates/television_fuzzy/Cargo.toml +++ b/crates/television_fuzzy/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "television-fuzzy" -version = "0.1.1" +version = "0.0.0" edition = "2021" description = "The revolution will be televised." license = "MIT" @@ -16,4 +16,4 @@ categories = [ [dependencies] nucleo = "0.5.0" -parking_lot = "0.12.3" +parking_lot = "0.12.3" \ No newline at end of file diff --git a/crates/television_previewers/Cargo.toml b/crates/television_previewers/Cargo.toml new file mode 100644 index 0000000..385a0d7 --- /dev/null +++ b/crates/television_previewers/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "television-previewers" +version = "0.0.0" +edition = "2021" + +[dependencies] +syntect = "5.2.0" +television-channels = { version = "0.0.0", path = "../television_channels" } +television-utils = { version = "0.0.0", path = "../television_utils" } +tracing = "0.1.40" +parking_lot = "0.12.3" +tokio = "1.41.1" +termtree = "0.5.1" +devicons = "0.6.11" +color-eyre = "0.6.3" +infer = "0.16.0" diff --git a/crates/television_previewers/src/lib.rs b/crates/television_previewers/src/lib.rs new file mode 100644 index 0000000..626f2ec --- /dev/null +++ b/crates/television_previewers/src/lib.rs @@ -0,0 +1 @@ +pub mod previewers; diff --git a/crates/television/previewers.rs b/crates/television_previewers/src/previewers.rs similarity index 94% rename from crates/television/previewers.rs rename to crates/television_previewers/src/previewers.rs index 81acaca..6dedfa2 100644 --- a/crates/television/previewers.rs +++ b/crates/television_previewers/src/previewers.rs @@ -1,13 +1,13 @@ use std::sync::Arc; -use crate::entry::Entry; +use television_channels::entry::{Entry, PreviewType}; -mod basic; -mod cache; -mod directory; -mod env; -mod files; -mod meta; +pub mod basic; +pub mod cache; +pub mod directory; +pub mod env; +pub mod files; +pub mod meta; // previewer types pub use basic::BasicPreviewer; @@ -21,15 +21,6 @@ pub use files::FilePreviewerConfig; //use ratatui_image::protocol::StatefulProtocol; use syntect::highlighting::Style; -#[derive(Debug, Clone, Eq, PartialEq, Hash, Default)] -pub enum PreviewType { - #[default] - Basic, - Directory, - EnvVar, - Files, -} - #[derive(Clone, Debug)] pub enum PreviewContent { Empty, diff --git a/crates/television/previewers/basic.rs b/crates/television_previewers/src/previewers/basic.rs similarity index 94% rename from crates/television/previewers/basic.rs rename to crates/television_previewers/src/previewers/basic.rs index dcbe377..4e9d13a 100644 --- a/crates/television/previewers/basic.rs +++ b/crates/television_previewers/src/previewers/basic.rs @@ -1,7 +1,7 @@ use std::sync::Arc; -use crate::entry::Entry; use crate::previewers::{Preview, PreviewContent}; +use television_channels::entry::Entry; #[derive(Debug, Default)] pub struct BasicPreviewer { diff --git a/crates/television/previewers/cache.rs b/crates/television_previewers/src/previewers/cache.rs similarity index 98% rename from crates/television/previewers/cache.rs rename to crates/television_previewers/src/previewers/cache.rs index 5da16e8..94e2bfb 100644 --- a/crates/television/previewers/cache.rs +++ b/crates/television_previewers/src/previewers/cache.rs @@ -16,6 +16,8 @@ use crate::previewers::Preview; /// /// # Example /// ```rust +/// use television_previewers::previewers::cache::RingSet; +/// /// let mut ring_set = RingSet::with_capacity(3); /// // push 3 values into the ringset /// assert_eq!(ring_set.push(1), None); @@ -45,7 +47,7 @@ use crate::previewers::Preview; /// assert!(ring_set.contains(&4)); /// ``` #[derive(Debug)] -struct RingSet { +pub struct RingSet { ring_buffer: VecDeque, known_keys: HashSet, capacity: usize, @@ -94,7 +96,7 @@ where } } - fn contains(&self, key: &T) -> bool { + pub fn contains(&self, key: &T) -> bool { self.known_keys.contains(key) } } diff --git a/crates/television/previewers/directory.rs b/crates/television_previewers/src/previewers/directory.rs similarity index 97% rename from crates/television/previewers/directory.rs rename to crates/television_previewers/src/previewers/directory.rs index c2a2d1f..7a9ffb8 100644 --- a/crates/television/previewers/directory.rs +++ b/crates/television_previewers/src/previewers/directory.rs @@ -5,11 +5,11 @@ use devicons::FileIcon; use parking_lot::Mutex; use termtree::Tree; -use crate::entry::Entry; +use television_channels::entry::Entry; use crate::previewers::cache::PreviewCache; use crate::previewers::{meta, Preview, PreviewContent}; -use crate::utils::files::walk_builder; +use television_utils::utils::files::walk_builder; #[derive(Debug, Default)] pub struct DirectoryPreviewer { diff --git a/crates/television/previewers/env.rs b/crates/television_previewers/src/previewers/env.rs similarity index 97% rename from crates/television/previewers/env.rs rename to crates/television_previewers/src/previewers/env.rs index 190c668..2bf7e14 100644 --- a/crates/television/previewers/env.rs +++ b/crates/television_previewers/src/previewers/env.rs @@ -1,8 +1,8 @@ use std::collections::HashMap; use std::sync::Arc; -use crate::entry; use crate::previewers::{Preview, PreviewContent}; +use television_channels::entry; #[derive(Debug, Default)] pub struct EnvVarPreviewer { diff --git a/crates/television/previewers/files.rs b/crates/television_previewers/src/previewers/files.rs similarity index 97% rename from crates/television/previewers/files.rs rename to crates/television_previewers/src/previewers/files.rs index 971ec86..be3fd41 100644 --- a/crates/television/previewers/files.rs +++ b/crates/television_previewers/src/previewers/files.rs @@ -14,15 +14,15 @@ use syntect::{ use tracing::{debug, warn}; use super::cache::PreviewCache; -use crate::entry; use crate::previewers::{meta, Preview, PreviewContent}; -use crate::utils::files::FileType; -use crate::utils::files::{get_file_size, is_known_text_extension}; -use crate::utils::strings::{ +use television_channels::entry; +use television_utils::utils::files::FileType; +use television_utils::utils::files::{get_file_size, is_known_text_extension}; +use television_utils::utils::strings::{ preprocess_line, proportion_of_printable_ascii_characters, PRINTABLE_ASCII_THRESHOLD, }; -use crate::utils::syntax::{self, load_highlighting_assets}; +use television_utils::utils::syntax::{self, load_highlighting_assets}; #[derive(Debug, Default)] pub struct FilePreviewer { diff --git a/crates/television/previewers/meta.rs b/crates/television_previewers/src/previewers/meta.rs similarity index 100% rename from crates/television/previewers/meta.rs rename to crates/television_previewers/src/previewers/meta.rs diff --git a/crates/television_utils/Cargo.toml b/crates/television_utils/Cargo.toml new file mode 100644 index 0000000..bfaf95a --- /dev/null +++ b/crates/television_utils/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "television-utils" +version = "0.0.0" +edition = "2021" + +[dependencies] +ignore = "0.4.23" +infer = "0.16.0" +lazy_static = "1.5.0" +tracing = "0.1.40" +color-eyre = "0.6.3" +bat = "0.24.0" +directories = "5.0.1" +syntect = "5.2.0" \ No newline at end of file diff --git a/crates/television_utils/src/lib.rs b/crates/television_utils/src/lib.rs new file mode 100644 index 0000000..b5614dd --- /dev/null +++ b/crates/television_utils/src/lib.rs @@ -0,0 +1 @@ +pub mod utils; diff --git a/crates/television/utils.rs b/crates/television_utils/src/utils.rs similarity index 74% rename from crates/television/utils.rs rename to crates/television_utils/src/utils.rs index d527488..23d0e88 100644 --- a/crates/television/utils.rs +++ b/crates/television_utils/src/utils.rs @@ -1,3 +1,5 @@ +use std::num::NonZeroUsize; + pub mod files; pub mod indices; pub mod strings; @@ -64,3 +66,19 @@ pub fn is_readable_stdin() -> bool { !std::io::stdin().is_terminal() && imp() } + +/// Get the number of threads to use by default. +/// +/// This will use the number of available threads if possible, but will default to 1 if the number +/// of available threads cannot be determined. It will also never use more than 32 threads to avoid +/// startup overhead. +pub fn default_num_threads() -> NonZeroUsize { + // default to 1 thread if we can't determine the number of available threads + let default = NonZeroUsize::MIN; + // never use more than 32 threads to avoid startup overhead + let limit = NonZeroUsize::new(32).unwrap(); + + std::thread::available_parallelism() + .unwrap_or(default) + .min(limit) +} diff --git a/crates/television/utils/files.rs b/crates/television_utils/src/utils/files.rs similarity index 99% rename from crates/television/utils/files.rs rename to crates/television_utils/src/utils/files.rs index ce43eff..6ce6d39 100644 --- a/crates/television/utils/files.rs +++ b/crates/television_utils/src/utils/files.rs @@ -6,7 +6,7 @@ use infer::Infer; use lazy_static::lazy_static; use tracing::debug; -use crate::config::default_num_threads; +use crate::utils::default_num_threads; lazy_static::lazy_static! { pub static ref DEFAULT_NUM_THREADS: usize = default_num_threads().into(); diff --git a/crates/television/utils/indices.rs b/crates/television_utils/src/utils/indices.rs similarity index 100% rename from crates/television/utils/indices.rs rename to crates/television_utils/src/utils/indices.rs diff --git a/crates/television/utils/strings.rs b/crates/television_utils/src/utils/strings.rs similarity index 100% rename from crates/television/utils/strings.rs rename to crates/television_utils/src/utils/strings.rs diff --git a/crates/television/utils/syntax.rs b/crates/television_utils/src/utils/syntax.rs similarity index 100% rename from crates/television/utils/syntax.rs rename to crates/television_utils/src/utils/syntax.rs