├── .gitignore ├── src ├── jview_help.rs ├── jview_config.rs ├── jview_search.rs ├── jview_debug.rs ├── jview_screen.rs ├── main.rs ├── jview_logs.rs └── jview_selector.rs ├── Cargo.toml ├── install.sh ├── LICENSE ├── README.md ├── .github └── workflows │ └── rust.yml └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | jview.log 3 | -------------------------------------------------------------------------------- /src/jview_help.rs: -------------------------------------------------------------------------------- 1 | use ratatui::{ 2 | style::{Style, Color}, 3 | widgets::{Block, Borders, Paragraph}, 4 | }; 5 | use ratatui::style; 6 | 7 | fn get_style() -> style::Style { 8 | Style::default().fg(Color::Green) 9 | } 10 | 11 | /// Creates a help widget for the application. 12 | /// 13 | /// # Arguments 14 | /// 15 | /// 16 | /// # Returns 17 | /// 18 | /// A `Paragraph` widget configured for the search functionality. 19 | pub fn get_widget() -> Paragraph<'static> { 20 | Paragraph::new("Help [Tab]: Switch Sections | [Up/Down/Left/Right]: Scroll | [q]: Quit") 21 | .block(Block::default().borders(Borders::ALL)) 22 | .style(get_style()) 23 | } -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "journalview" 3 | version = "0.1.0" 4 | edition = "2021" 5 | authors = ["Vijo Cherian "] 6 | description = "A lightweight, terminal-based application written in Rust for efficiently viewing, filtering, and navigating system logs from `journalctl`." 7 | license = "MIT" # Ensure this matches your LICENSE file 8 | repository = "https://github.com/codervijo/journalview" 9 | homepage = "https://github.com/codervijo/journalview" 10 | documentation = "https://docs.rs/journalview" 11 | readme = "README.md" 12 | keywords = ["journal", "view", "rust"] 13 | categories = ["command-line-utilities"] 14 | 15 | [dependencies] 16 | chrono = "0.4.39" 17 | crossterm = "0.24" 18 | lazy_static = "1.5.0" 19 | log = "0.4.22" 20 | once_cell = "1.20.2" 21 | ratatui = { version = "0.30.0-alpha.0" } 22 | -------------------------------------------------------------------------------- /install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | # Define output file name 5 | BUILD_DATE="31.01.2025" 6 | RELEASE_VERSION="v0.0.34" 7 | OUTPUT_FILE="journalview-latest-${BUILD_DATE}.zip" 8 | ARCH="x86-64" 9 | OS="unknown-linux-musl" 10 | 11 | # GitHub release download URL 12 | DOWNLOAD_URL="https://github.com/codervijo/journalview/releases/download/${RELEASE_VERSION}/journalview-latest-${BUILD_DATE}.zip" 13 | 14 | mkdir -p $HOME/.local/bin 15 | 16 | # Download the binary 17 | echo "Downloading JournalView from: $DOWNLOAD_URL" 18 | curl -L "$DOWNLOAD_URL" -o "$OUTPUT_FILE" 19 | 20 | # Extract the ZIP file 21 | echo "Extracting $OUTPUT_FILE..." 22 | unzip "$OUTPUT_FILE" -d ./journalview 23 | 24 | # Make executable 25 | chmod +x ./journalview/bin/journalview-latest-${ARCH}-${OS} 26 | cp ./journalview/bin/journalview-latest-${ARCH}-${OS} ${HOME}/.local/bin/journalview 27 | chmod +x $HOME/.local/bin/journalview 28 | 29 | echo "Download complete. Run journalview to start JournalView." 30 | 31 | 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 codervijo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/jview_config.rs: -------------------------------------------------------------------------------- 1 | use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; 2 | use std::sync::Mutex; 3 | 4 | pub mod settings { 5 | use super::*; 6 | 7 | // Static variables for various settings 8 | lazy_static::lazy_static! { 9 | // Mutex-protected for settings that might require more complex types 10 | static ref UNIT: Mutex = Mutex::new(String::new()); 11 | } 12 | 13 | // Atomic values for thread-safe primitive types 14 | #[allow(dead_code)] 15 | static MAX_CONNECTIONS: AtomicUsize = AtomicUsize::new(10); 16 | #[allow(dead_code)] 17 | static LOGGING_ENABLED: AtomicBool = AtomicBool::new(true); 18 | 19 | /// Set the username 20 | pub fn set_unit(name: &str) { 21 | let mut unit = UNIT.lock().unwrap(); 22 | *unit = name.to_string(); 23 | } 24 | 25 | /// Get the username 26 | pub fn get_unit() -> String { 27 | let unit = UNIT.lock().unwrap(); 28 | unit.clone() 29 | } 30 | 31 | /// Clear the unit 32 | pub fn clear_unit() { 33 | let mut unit = UNIT.lock().unwrap(); 34 | *unit = String::new(); // Clear the content 35 | } 36 | 37 | /// Set the maximum number of connections 38 | #[allow(dead_code)] 39 | pub fn set_max_connections(value: usize) { 40 | MAX_CONNECTIONS.store(value, Ordering::SeqCst); 41 | } 42 | 43 | /// Get the maximum number of connections 44 | #[allow(dead_code)] 45 | pub fn get_max_connections() -> usize { 46 | MAX_CONNECTIONS.load(Ordering::SeqCst) 47 | } 48 | 49 | /// Enable or disable logging 50 | #[allow(dead_code)] 51 | pub fn set_logging_enabled(enabled: bool) { 52 | LOGGING_ENABLED.store(enabled, Ordering::SeqCst); 53 | } 54 | 55 | /// Check if logging is enabled 56 | #[allow(dead_code)] 57 | pub fn is_logging_enabled() -> bool { 58 | LOGGING_ENABLED.load(Ordering::SeqCst) 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # JournalView 2 | 3 | A lightweight, terminal-based application written in Rust for efficiently viewing, filtering, and navigating system logs from `journalctl`. 4 | 5 | ![jview1](https://github.com/user-attachments/assets/78a97592-1c5e-4f34-ba42-dc8bf5d8b573) 6 | 7 | ## Features 8 | 9 | - **Log Viewing**: Access logs from `journalctl` logs. 10 | - **Filtering**: Powerful filtering capabilities 11 | - **Keyboard Navigation**: Intuitive hotkeys for seamless log exploration. 12 | - **Customizable View**: Adjust the display for better readability. 13 | 14 | ## Installation 15 | 16 | ### Install Directly (Without Building from Source) 17 | ``` 18 | curl -sL https://github.com/codervijo/journalview/raw/main/install.sh | bash 19 | ``` 20 | 21 | ### Build From Source 22 | 23 | Ensure Rust is installed. You can install Rust using [rustup](https://rustup.rs/). 24 | 25 | ```bash 26 | cargo install --git https://github.com/codervijo/journalview.git journalview 27 | ``` 28 | 29 | ## Usage 30 | 31 | ### Basic Commands 32 | 33 | - Launch the application: 34 | ```bash 35 | journalview 36 | ``` 37 | 38 | - Navigate logs using arrow keys or predefined hotkeys. 39 | 40 | ### Filtering Logs 41 | 42 | - Press `/` to enter a search query (regex supported). 43 | - Use `Tab` to switch between different log sources. 44 | 45 | ### Hotkeys 46 | 47 | | Key | Action | 48 | |------------|------------------------------| 49 | | `Arrow Up` | Scroll up in the log list | 50 | | `Arrow Down` | Scroll down in the log list | 51 | | `Enter` | Select a log entry | 52 | | `/` | Start a search | 53 | | `q` | Quit the application | 54 | 55 | ## Contributing 56 | 57 | Contributions are welcome! Follow these steps to contribute: 58 | 59 | 1. Fork the repository. 60 | 2. Create a feature branch: 61 | ```bash 62 | git checkout -b feature-name 63 | ``` 64 | 3. Commit your changes: 65 | ```bash 66 | git commit -m "Description of changes" 67 | ``` 68 | 4. Push to your fork: 69 | ```bash 70 | git push origin feature-name 71 | ``` 72 | 5. Open a Pull Request. 73 | 74 | ## Acknoweldgements 75 | 76 | Thanks to the following projects for inspiration 77 | - [Ratatui](https://github.com/ratatui/ratatui) 78 | - [Lazyjournal](https://github.com/Lifailon/lazyjournal) 79 | 80 | ## License 81 | 82 | This project is licensed under the [MIT License](LICENSE). 83 | 84 | ## Acknowledgments 85 | 86 | Inspired by the functionality of `journalctl` and enhanced by the capabilities of Rust for high-performance, terminal-based tools. 87 | -------------------------------------------------------------------------------- /src/jview_search.rs: -------------------------------------------------------------------------------- 1 | use ratatui::{ 2 | style::{Style, Color}, 3 | widgets::{Block, Borders, Paragraph}, 4 | }; 5 | use crossterm::event::{self, KeyCode}; 6 | use ratatui::style; 7 | 8 | #[derive(Debug, Clone, PartialEq, Eq)] 9 | pub struct JviewSearch { 10 | input: String, 11 | help: String, 12 | inited: bool, 13 | } 14 | 15 | impl JviewSearch { 16 | pub fn new() -> Self { 17 | JviewSearch { 18 | input: "".to_string(), 19 | help: "Type to start searching...".to_string(), 20 | inited: false, 21 | } 22 | } 23 | } 24 | 25 | fn get_style(selected: bool) -> style::Style { 26 | if selected { 27 | Style::default() 28 | .fg(Color::Cyan) 29 | .bg(Color::Black) 30 | } else { 31 | Style::default() 32 | .fg(Color::Yellow) 33 | .bg(Color::Blue) 34 | } 35 | } 36 | 37 | impl JviewSearch { 38 | /// Creates a search widget for the application. 39 | /// 40 | /// # Arguments 41 | /// 42 | /// * `selected` - Is this widget currently selected? 43 | /// 44 | /// # Returns 45 | /// 46 | /// A `Paragraph` widget configured for the search functionality. 47 | pub fn get_search_widget(self, selected: bool) -> Paragraph<'static> { 48 | let intext; 49 | if self.inited == true { 50 | intext = format!("\u{1F50D} {}", self.input); 51 | } else { 52 | intext = format!("\u{1F50D} {}", self.help); 53 | } 54 | Paragraph::new(intext) 55 | .block(Block::default().borders(Borders::ALL).title("Search")) 56 | .style(get_style(selected)) 57 | } 58 | 59 | pub fn get_search_input(&mut self) -> Result { 60 | let mut input = String::new(); 61 | if let event::Event::Key(key) = event::read()? { 62 | match key.code { 63 | KeyCode::Esc => { 64 | return Ok(KeyCode::Tab); // Escape to stop input 65 | } 66 | KeyCode::Backspace => { 67 | self.input.pop(); // Remove last character 68 | } 69 | KeyCode::Enter => { 70 | return Ok(KeyCode::Tab); // Enter to submit input 71 | } 72 | KeyCode::Char(c) => { 73 | self.inited = true; 74 | input.push(c); // Add character to input string 75 | } 76 | KeyCode::Tab => { 77 | return Ok(KeyCode::Tab); 78 | } 79 | _ => {} 80 | } 81 | } 82 | self.input += &input.clone(); 83 | Ok(KeyCode::Enter) 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /src/jview_debug.rs: -------------------------------------------------------------------------------- 1 | use log::{Level, Metadata, Record}; 2 | use std::fs::{File, OpenOptions}; 3 | use std::sync::Mutex; 4 | use std::io::{Write, BufWriter}; 5 | use once_cell::sync::Lazy; // For lazy initialization 6 | use chrono::Utc; 7 | use log::Log; 8 | use std::fmt::Arguments; 9 | 10 | struct FileLogger { 11 | file: Option>>, // Use Option to safely allow closing the file 12 | } 13 | 14 | impl log::Log for FileLogger { 15 | fn enabled(&self, metadata: &Metadata) -> bool { 16 | metadata.level() <= Level::Info 17 | } 18 | 19 | fn log(&self, record: &Record) { 20 | if self.enabled(record.metadata()) { 21 | if let Some(ref file_mutex) = self.file.as_ref() { // Borrow the file safely 22 | if let Ok(mut file) = file_mutex.lock() { 23 | let log_entry = format!( 24 | "{} - [{}] {}\n", 25 | Utc::now().to_rfc3339(), 26 | record.level(), 27 | record.args() 28 | ); 29 | let _ = file.write_all(log_entry.as_bytes()); 30 | let _ = file.flush(); 31 | } 32 | } 33 | } 34 | } 35 | 36 | fn flush(&self) { 37 | if let Some(ref file_mutex) = self.file.as_ref() { // Safely borrow 38 | if let Ok(mut file) = file_mutex.lock() { 39 | let _ = file.flush(); 40 | } 41 | } 42 | } 43 | } 44 | 45 | impl Drop for FileLogger { 46 | fn drop(&mut self) { 47 | if let Some(ref file_mutex) = self.file.as_ref() { 48 | if let Ok(mut file) = file_mutex.lock() { 49 | let _ = file.flush(); 50 | } 51 | } 52 | println!("Logger dropped, file closed."); 53 | } 54 | } 55 | 56 | // Lazy initialization of the logger 57 | static LOGGER: Lazy = Lazy::new(|| { 58 | let file = OpenOptions::new() 59 | .create(true) 60 | .append(true) 61 | .open("./jview.log") 62 | .expect("Failed to open log file"); 63 | FileLogger { 64 | file: Some(Mutex::new(BufWriter::new(file))), 65 | } 66 | }); 67 | 68 | /// Initialize the file logger 69 | pub fn init_debug_log() { 70 | log::set_logger(&*LOGGER) 71 | .map(|()| log::set_max_level(log::LevelFilter::Info)) 72 | .expect("Failed to set logger"); 73 | } 74 | 75 | /// Shutdown and flush the logs before exiting 76 | #[allow(dead_code)] 77 | pub fn shutdown_debug_log() { 78 | if let Some(ref file_mutex) = LOGGER.file.as_ref() { 79 | if let Ok(mut file) = file_mutex.lock() { 80 | let _ = file.flush(); 81 | println!("Shutdown and flushed log data."); 82 | } 83 | } 84 | } 85 | 86 | pub fn log_debug_info(message: &str, args: Arguments) { 87 | let formatted_message = format!("{}{}", message, args); // Convert Arguments to string 88 | // Assuming logging to a file or stdout 89 | log::info!("{}", formatted_message); // Print or log the formatted message 90 | LOGGER.flush(); 91 | } 92 | 93 | #[allow(dead_code)] 94 | pub fn log_debug_warn(message: String) { 95 | log::warn!("{}", message); 96 | } 97 | 98 | #[allow(dead_code)] 99 | pub fn log_debug_error(message: String) { 100 | log::error!("{}", message); 101 | } -------------------------------------------------------------------------------- /.github/workflows/rust.yml: -------------------------------------------------------------------------------- 1 | name: Rust 2 | 3 | on: 4 | push: 5 | branches: [ "main" ] 6 | pull_request: 7 | branches: [ "main" ] 8 | workflow_dispatch: 9 | inputs: 10 | version: 11 | description: 'The version of the release' 12 | required: false 13 | default: 'latest' 14 | 15 | env: 16 | CARGO_TERM_COLOR: always 17 | 18 | jobs: 19 | build: 20 | runs-on: ubuntu-22.04 21 | 22 | permissions: 23 | contents: write 24 | id-token: write 25 | actions: write 26 | packages: write 27 | 28 | steps: 29 | - name: Clone repository 30 | uses: actions/checkout@v4 31 | 32 | - name: Install Cross Compilation Targets 33 | run: | 34 | rustup target add x86_64-unknown-linux-gnu 35 | rustup target add aarch64-unknown-linux-gnu 36 | rustup target add x86_64-apple-darwin 37 | rustup target add aarch64-apple-darwin 38 | rustup target add x86_64-pc-windows-gnu 39 | rustup target add aarch64-pc-windows-msvc 40 | cargo install cross 41 | 42 | - name: Build Binaries 43 | run: | 44 | version="latest" 45 | 46 | mkdir -p bin 47 | 48 | architectures=("x86_64-unknown-linux-musl") 49 | 50 | for arch in "${architectures[@]}"; do 51 | cross build --release --target $arch 52 | arch_name=$(echo $arch | sed 's/[^a-zA-Z0-9]/-/g') # Sanitize the architecture name 53 | mv target/$arch/release/journalview bin/journalview-$version-$arch_name 54 | done 55 | 56 | echo "ARTIFACT_NAME=journalview-${version}-$(date +'%d.%m.%Y').zip" >> $GITHUB_ENV 57 | 58 | - name: Create a zip file with binaries 59 | run: | 60 | zip -r ${{ env.ARTIFACT_NAME }} bin/ 61 | 62 | - name: Check GitHub Token 63 | run: | 64 | echo "Token Length: ${#GITHUB_TOKEN}" 65 | env: 66 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 67 | 68 | - name: Debug GitHub Token 69 | run: | 70 | curl -H "Authorization: token $GITHUB_TOKEN" https://api.github.com/user 71 | env: 72 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 73 | 74 | - name: Create GitHub Release 75 | uses: actions/create-release@v1 76 | id: create_release 77 | with: 78 | tag_name: v0.0.${{ github.run_number }} 79 | release_name: "Release v0.0.${{ github.run_number }}" 80 | body: "Release of journalview version ${{ github.event.inputs.version }}" 81 | draft: false 82 | prerelease: false 83 | env: 84 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 85 | 86 | - name: Debug Upload URL 87 | run: | 88 | echo "Upload URL: ${{ steps.create_release.outputs.upload_url }}" 89 | 90 | - name: Upload release asset using gh CLI 91 | run: | 92 | gh release upload v0.0.${{ github.run_number }} ${{ env.ARTIFACT_NAME }} 93 | env: 94 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 95 | 96 | # - name: Upload release asset 97 | # uses: actions/upload-release-asset@v1 98 | # with: 99 | # upload_url: ${{ steps.create_release.outputs.upload_url }} 100 | # asset_path: ${{ env.ARTIFACT_NAME }} 101 | # asset_name: ${{ env.ARTIFACT_NAME }} 102 | # asset_content_type: application/zip 103 | -------------------------------------------------------------------------------- /src/jview_screen.rs: -------------------------------------------------------------------------------- 1 | use crossterm::event::KeyCode; 2 | use ratatui::widgets::Paragraph; 3 | use ratatui::{ 4 | widgets::{List}, 5 | }; 6 | use crate::jview_logs; 7 | use crate::jview_search; 8 | use crate::jview_selector; 9 | 10 | #[derive(Debug, Clone, Copy, PartialEq, Eq)] 11 | pub enum UiSection { 12 | Search, 13 | Logs, 14 | Selector, 15 | #[allow(dead_code)] 16 | Help, 17 | } 18 | 19 | impl UiSection { 20 | // Get the next variant, returning None when reaching the end 21 | pub fn next(&self) -> UiSection { 22 | match self { 23 | UiSection::Search => UiSection::Logs, 24 | UiSection::Logs => UiSection::Selector, 25 | UiSection::Selector => UiSection::Search, 26 | &UiSection::Help => todo!(), 27 | } 28 | } 29 | } 30 | 31 | #[derive(Clone)] 32 | pub struct UiScreen { 33 | selected: UiSection, 34 | search_tui: jview_search::JviewSearch, 35 | logs_tui: jview_logs::JviewLogs, 36 | selector_tui: jview_selector::JviewSelector, 37 | } 38 | 39 | impl UiScreen { 40 | pub fn new() -> Self { 41 | UiScreen { 42 | selected: UiSection::Logs, 43 | search_tui: jview_search::JviewSearch::new(), 44 | logs_tui: jview_logs::JviewLogs::new(), 45 | selector_tui: jview_selector::JviewSelector::new(), 46 | } 47 | } 48 | 49 | pub fn next_section(&mut self) { 50 | self.selected = self.selected.next(); 51 | } 52 | 53 | pub fn get_selected(&self) -> UiSection { 54 | self.selected 55 | } 56 | 57 | pub fn get_search_widget(&self, selected: bool) -> Paragraph<'static> { 58 | self.search_tui.clone().get_search_widget(selected) 59 | } 60 | 61 | pub fn get_logs_widget<'a>(&self, selected: bool) -> List<'a> { 62 | self.logs_tui.clone().get_logs_widget(selected) 63 | } 64 | 65 | pub fn get_selector_widget(&self, selected: bool) -> List { 66 | self.selector_tui.clone().get_selector_widget(selected) 67 | } 68 | 69 | pub fn set_logs_max_height(&mut self, h: usize) { 70 | self.logs_tui.set_max_height(h); 71 | } 72 | 73 | pub fn set_selector_max_height(&mut self, h: usize) { 74 | self.selector_tui.set_max_height(h); 75 | } 76 | } 77 | 78 | pub fn screen_navigate(screen: &mut UiScreen) -> Result { 79 | if screen.get_selected() == UiSection::Search { 80 | let res = screen.search_tui.get_search_input()?; 81 | match res { 82 | KeyCode::Char('q') => return Ok(true), 83 | KeyCode::Char('Q') => return Ok(true), 84 | KeyCode::Tab => { 85 | screen.next_section(); 86 | return Ok(false); 87 | } 88 | _ => {} 89 | } 90 | return Ok(false); 91 | } 92 | 93 | if screen.get_selected() == UiSection::Logs { 94 | let res = screen.logs_tui.logs_navigate()?; 95 | match res { 96 | KeyCode::Char('q') => return Ok(true), 97 | KeyCode::Char('Q') => return Ok(true), 98 | KeyCode::Tab => { 99 | screen.next_section(); 100 | return Ok(false); 101 | } 102 | _ => {} 103 | } 104 | return Ok(false); 105 | } 106 | 107 | if screen.get_selected() == UiSection::Selector { 108 | let res = screen.selector_tui.navigate()?; 109 | match res { 110 | KeyCode::Char('q') => return Ok(true), 111 | KeyCode::Char('Q') => return Ok(true), 112 | KeyCode::Tab => { 113 | screen.next_section(); 114 | return Ok(false); 115 | } 116 | _ => {} 117 | } 118 | return Ok(false); 119 | } 120 | 121 | Ok(false) 122 | } -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use ratatui::{ 2 | backend::CrosstermBackend, 3 | layout::{Constraint, Direction, Layout}, 4 | Terminal, 5 | }; 6 | use crossterm::{ 7 | execute, 8 | terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, 9 | }; 10 | use std::io; 11 | 12 | mod jview_screen; 13 | mod jview_logs; 14 | mod jview_search; 15 | mod jview_selector; 16 | mod jview_help; 17 | mod jview_config; 18 | mod jview_debug; 19 | 20 | use crate::jview_screen::UiScreen; 21 | use crate::jview_screen::UiSection::Search; 22 | use crate::jview_screen::UiSection::Logs; 23 | use crate::jview_screen::UiSection::Selector; 24 | //use crate::jview_screen::UiSection::Help; 25 | 26 | fn main() -> Result<(), io::Error> { 27 | enable_raw_mode()?; 28 | let mut stdout = io::stdout(); 29 | execute!(stdout, EnterAlternateScreen)?; 30 | let backend = CrosstermBackend::new(stdout); 31 | let mut terminal = Terminal::new(backend)?; 32 | let mut screen = UiScreen::new(); // Persistent screen state 33 | 34 | jview_debug::init_debug_log(); 35 | jview_debug::log_debug_info("Starting journalview", format_args!("")); 36 | loop { 37 | terminal.draw(|f| { 38 | // Define the layout with two main sections: Left and Right 39 | let overall_layout = Layout::default() 40 | .direction(Direction::Vertical) // Split horizontally into left and right columns 41 | .constraints([ 42 | Constraint::Length(1), // Top margin 43 | Constraint::Min(5), 44 | Constraint::Length(3), 45 | ]) 46 | .split(f.area()); 47 | 48 | let active_layout = Layout::default() 49 | .direction(Direction::Horizontal) // Split horizontally into left and right columns 50 | .constraints([ 51 | Constraint::Percentage(20), // Left column takes up 20% of the width 52 | Constraint::Percentage(80), // Right column takes up 80% of the width 53 | ]) 54 | .split(overall_layout[1]); 55 | 56 | let selection_chunks = Layout::default() 57 | .direction(Direction::Vertical) 58 | .constraints([ 59 | Constraint::Percentage(100), 60 | ]) 61 | .split(active_layout[0]); 62 | 63 | let viewer_chunks = Layout::default() 64 | .direction(Direction::Vertical) 65 | .constraints([ 66 | Constraint::Length(3), // Search section 67 | Constraint::Min(5), // Logs section 68 | ]) 69 | .split(active_layout[1]); 70 | 71 | // Define the layout for the Help section, which takes up the entire width of the terminal 72 | let help_chunk = Layout::default() 73 | .direction(Direction::Horizontal) // Single row that spans the entire width 74 | .constraints([Constraint::Min(1)]) // Only one section (Help) that takes the entire space 75 | .split(overall_layout[2])[0]; // Apply to the whole width 76 | 77 | // Draw the left column selector 78 | screen.set_selector_max_height(selection_chunks[0].height as usize); 79 | let selwidget = screen.get_selector_widget(screen.get_selected() == Selector); 80 | f.render_widget(selwidget, selection_chunks[0]); 81 | 82 | // Search Section 83 | let search_widget = screen.get_search_widget(screen.get_selected() == Search); 84 | f.render_widget(search_widget, viewer_chunks[0]); 85 | 86 | // Logs Section 87 | //let mut log_items: Vec = jview_logs::get_log_items(0, viewer_chunks[1].height as usize, 0, screen.get_selected() == Logs); 88 | //let mut log_items: Vec = jview_logs::get_log_items(vertical_offset, viewer_chunks[1].height as usize, horizontal_offset, screen.get_selected() == Logs); 89 | screen.set_logs_max_height(viewer_chunks[1].height as usize); 90 | let logs_widget = screen.get_logs_widget(screen.get_selected() == Logs); 91 | f.render_widget(logs_widget, viewer_chunks[1]); 92 | 93 | // Help Section 94 | let help_widget = jview_help::get_widget(); 95 | f.render_widget(help_widget, help_chunk); 96 | 97 | })?; 98 | if jview_screen::screen_navigate(&mut screen)? == true { 99 | break; 100 | } 101 | } 102 | 103 | disable_raw_mode()?; 104 | execute!(terminal.backend_mut(), LeaveAlternateScreen)?; 105 | terminal.show_cursor()?; 106 | Ok(()) 107 | } 108 | -------------------------------------------------------------------------------- /src/jview_logs.rs: -------------------------------------------------------------------------------- 1 | use std::{process::Command}; 2 | use ratatui::{ 3 | style::{Style, Color}, 4 | widgets::{Block, Borders, List, ListItem}, 5 | }; 6 | use ratatui::style; 7 | use crossterm::event::{self, Event, KeyCode}; 8 | #[allow(unused_imports)] 9 | use crate::jview_config; 10 | use crate::jview_config::settings; 11 | use crate::jview_debug; 12 | 13 | #[derive(Debug, Clone, PartialEq, Eq, Copy)] 14 | pub struct JviewLogs { 15 | vertical_start: usize, 16 | horizontal_start: usize, 17 | max_viewer_height: usize, 18 | max_viewer_width: usize, 19 | } 20 | 21 | impl JviewLogs { 22 | pub fn new() -> Self { 23 | JviewLogs { 24 | vertical_start: 0, 25 | horizontal_start: 0, 26 | max_viewer_height: 25, 27 | max_viewer_width: 25, 28 | } 29 | } 30 | 31 | pub fn set_max_height(&mut self, h: usize) { 32 | self.max_viewer_height = h; 33 | } 34 | } 35 | 36 | pub fn fetch_journalctl_logs() -> Vec { 37 | let chosen = settings::get_unit(); 38 | let mut jargs = vec![]; 39 | 40 | if !chosen.is_empty() { 41 | jview_debug::log_debug_info("Found Selected Unit to filter:", format_args!("{}", chosen)); 42 | jargs.push("-u".to_string()); 43 | jargs.push(chosen); 44 | } else { 45 | jargs.push("--since=yesterday".to_string()); 46 | } 47 | 48 | jview_debug::log_debug_info("Doing command:", format_args!("{:?}", jargs)); 49 | let output = Command::new("journalctl") 50 | .args(&jargs) 51 | .output() 52 | .expect("Failed to run journalctl command"); 53 | 54 | if output.status.success() { 55 | //jview_debug::log_debug_info("Command output: ", format_args!("{}", String::from_utf8_lossy(&output.stdout))); 56 | String::from_utf8_lossy(&output.stdout) 57 | .lines() 58 | .map(|line| line.to_string()) 59 | .collect() 60 | } else { 61 | vec!["Error fetching logs".to_string()] 62 | } 63 | } 64 | 65 | pub fn get_style(selected: bool) -> style::Style { 66 | if selected { 67 | Style::default() 68 | .fg(Color::Cyan) 69 | .bg(Color::Black) 70 | } else { 71 | Style::default() 72 | .fg(Color::Yellow) 73 | .bg(Color::Blue) 74 | } 75 | } 76 | 77 | impl JviewLogs { 78 | fn get_log_items(self, selected: bool) -> Vec> { 79 | let logs = fetch_journalctl_logs(); 80 | let mut log_items: Vec = Vec::new(); // Viewable 81 | 82 | for (i, line) in logs.iter().enumerate() { 83 | if i < self.vertical_start { 84 | continue; // Skip lines until the vertical offset 85 | } 86 | 87 | if log_items.len() >= self.max_viewer_height { 88 | break; // Stop if we've taken enough lines to fit the section 89 | } 90 | 91 | let visible_line = if line.len() > self.horizontal_start { 92 | &line[self.horizontal_start..] 93 | } else { 94 | "" 95 | }; 96 | 97 | let style = get_style(selected); 98 | 99 | log_items.push(ListItem::new(visible_line.to_string()).style(style)); 100 | } 101 | 102 | log_items 103 | } 104 | 105 | /// Creates a configurable widget for displaying a list of items. 106 | /// 107 | /// # Arguments 108 | /// 109 | /// * `selected` - 110 | /// 111 | /// # Returns 112 | /// 113 | /// A `List` widget configured with the provided parameters. 114 | pub fn get_logs_widget<'b>(&self, selected: bool) -> List<'b> { 115 | let logitems: Vec = (*self.get_log_items(selected)).to_vec(); 116 | 117 | List::new(logitems) 118 | .block(Block::default().borders(Borders::ALL).title("Logs")) 119 | .style(get_style(selected)) 120 | } 121 | 122 | 123 | pub fn logs_navigate(&mut self) -> Result { 124 | let logs = fetch_journalctl_logs(); 125 | 126 | if let Event::Key(key) = event::read()? { 127 | match key.code { 128 | KeyCode::Char('q') => return Ok(KeyCode::Char('q')), 129 | KeyCode::Char('Q') => return Ok(KeyCode::Char('q')), 130 | KeyCode::Tab => { 131 | return Ok(KeyCode::Tab); 132 | } 133 | KeyCode::Up => { 134 | if self.vertical_start > 0 { 135 | self.vertical_start -= 1; 136 | } 137 | } 138 | KeyCode::Down => { 139 | if self.vertical_start < logs.len() { 140 | self.vertical_start += 1; 141 | } 142 | } 143 | KeyCode::Left => { 144 | if self.horizontal_start > 0 { 145 | self.horizontal_start -= 1; 146 | } 147 | } 148 | KeyCode::Right => { 149 | self.horizontal_start += 1; 150 | } 151 | _ => {} 152 | } 153 | } 154 | 155 | Ok(KeyCode::Enter) 156 | } 157 | } -------------------------------------------------------------------------------- /src/jview_selector.rs: -------------------------------------------------------------------------------- 1 | use ratatui::{ 2 | style::{Style, Color}, 3 | widgets::{Block, Borders, List, ListItem}, 4 | }; 5 | use crossterm::event::{self, Event, KeyCode}; 6 | use std::process::Command; 7 | #[allow(unused_imports)] 8 | use crate::jview_config; 9 | use crate::jview_config::settings; 10 | use crate::jview_debug; 11 | 12 | #[derive(Debug, Clone, PartialEq, Eq)] 13 | pub struct JviewSelector { 14 | selected_idx: usize, 15 | vertical_start: usize, 16 | horizontal_start: usize, 17 | max_viewer_height: usize, 18 | units: Vec, 19 | } 20 | 21 | impl JviewSelector { 22 | pub fn new() -> Self { 23 | JviewSelector { 24 | selected_idx: 0, 25 | vertical_start: 0, 26 | horizontal_start: 0, 27 | max_viewer_height: 15, 28 | units: fetch_systemd_units(), 29 | } 30 | } 31 | 32 | pub fn set_max_height(&mut self, h: usize) { 33 | self.max_viewer_height = h; 34 | } 35 | 36 | fn get_visible_units(&self) -> Vec { 37 | let mut vitems: Vec = Vec::new(); // Viewable units 38 | 39 | for (i, line) in self.units.iter().enumerate() { 40 | if i < self.vertical_start { 41 | continue; // Skip lines until the vertical offset 42 | } 43 | 44 | if vitems.len() >= self.max_viewer_height { 45 | break; // Stop if we've taken enough lines to fit the section 46 | } 47 | 48 | let visible_line = if line.len() > self.horizontal_start { 49 | &line[self.horizontal_start..] 50 | } else { 51 | "" 52 | }; 53 | 54 | vitems.push(visible_line.to_string()); 55 | } 56 | 57 | vitems 58 | } 59 | 60 | 61 | /// Navigate the list vertically based on user input. 62 | /// 63 | /// # Arguments 64 | /// 65 | pub fn navigate(&mut self) -> Result { 66 | 67 | if let Event::Key(key) = event::read()? { 68 | match key.code { 69 | KeyCode::Char('q') => return Ok(KeyCode::Char('q')), 70 | KeyCode::Char('Q') => return Ok(KeyCode::Char('q')), 71 | KeyCode::Tab => { 72 | return Ok(KeyCode::Tab); 73 | } 74 | KeyCode::Enter => { 75 | settings::set_unit(&self.units[self.selected_idx]); 76 | jview_debug::log_debug_info("Selected Unit ID to filter: ", format_args!("{}", self.selected_idx)); 77 | jview_debug::log_debug_info("Selected Unit to filter:", format_args!("{}", self.units[self.selected_idx])); 78 | return Ok(KeyCode::Tab); 79 | } 80 | KeyCode::Up => { 81 | if self.vertical_start > 0 { 82 | self.vertical_start -= 1; 83 | } 84 | if self.selected_idx > 0 { 85 | self.selected_idx -= 1; 86 | } 87 | jview_debug::log_debug_info("Clearing unit 1", format_args!("{:?}", key.code)); 88 | settings::clear_unit(); 89 | } 90 | KeyCode::Down => { 91 | self.selected_idx += 1; 92 | if self.selected_idx >= self.max_viewer_height-4 { 93 | self.vertical_start += 1; 94 | } 95 | jview_debug::log_debug_info("Clearing unit 2", format_args!("{:?}", key.code)); 96 | settings::clear_unit(); 97 | } 98 | KeyCode::Left => { 99 | if self.horizontal_start > 0 { 100 | self.horizontal_start -= 1; 101 | } 102 | } 103 | KeyCode::Right => { 104 | self.horizontal_start += 1; 105 | } 106 | _ => {} 107 | } 108 | 109 | } 110 | Ok(KeyCode::Enter) 111 | 112 | } 113 | 114 | /// Creates a selector widget for the application. 115 | /// 116 | /// # Arguments 117 | /// 118 | /// * `selected` - Is this widget currently selected? 119 | /// 120 | /// # Returns 121 | /// 122 | /// A `List` widget configured for the systemd units. 123 | pub fn get_selector_widget(&self, selected: bool) -> List<'static> { 124 | let vunits = self.get_visible_units(); 125 | let items: Vec = vunits 126 | .into_iter() 127 | .enumerate() 128 | .map(|(i, unit)| { 129 | let style = if (i + self.vertical_start) == self.selected_idx { 130 | Style::default().fg(Color::Black).bg(Color::Cyan) 131 | } else { 132 | get_style(selected) 133 | }; 134 | if settings::get_unit() == unit { 135 | let su = format!("\u{2714} {}", unit); 136 | ListItem::new(su).style(style) 137 | } else if (i+self.vertical_start) == self.selected_idx { 138 | let su = format!("\u{2713} {}", unit); 139 | ListItem::new(su).style(style) 140 | } else { 141 | ListItem::new(unit).style(style) 142 | } 143 | }) 144 | .collect(); 145 | 146 | List::new(items) 147 | .block( 148 | Block::default() 149 | .borders(Borders::ALL) 150 | .title("Systemd Units"), 151 | ) 152 | .style(get_style(selected)) 153 | } 154 | } 155 | 156 | fn fetch_systemd_units() -> Vec { 157 | let output = Command::new("bash") 158 | .args(["-c", "systemctl list-units --all --no-pager --plain | awk '{print $1}'|grep '.service'"]) 159 | .output() 160 | .expect("Failed to run systemctl command"); 161 | /* 162 | Use this in the future and use json output 163 | systemctl list-units --all --plain --no-legend --no-pager --output=json 164 | */ 165 | if output.status.success() { 166 | let mut result = Vec::new(); 167 | 168 | for line in String::from_utf8_lossy(&output.stdout).lines() { 169 | if line.contains(".service") { 170 | result.push(line.replace(".service", "")); 171 | } else { 172 | result.push(line.to_string()) 173 | } 174 | } 175 | result 176 | } else { 177 | vec!["".to_string()] 178 | } 179 | } 180 | 181 | fn get_style(selected: bool) -> Style { 182 | if selected { 183 | Style::default().fg(Color::Cyan).bg(Color::Black) 184 | } else { 185 | Style::default().fg(Color::Yellow).bg(Color::Blue) 186 | } 187 | } 188 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "aho-corasick" 7 | version = "1.1.3" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 10 | dependencies = [ 11 | "memchr", 12 | ] 13 | 14 | [[package]] 15 | name = "allocator-api2" 16 | version = "0.2.21" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" 19 | 20 | [[package]] 21 | name = "android-tzdata" 22 | version = "0.1.1" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 25 | 26 | [[package]] 27 | name = "android_system_properties" 28 | version = "0.1.5" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 31 | dependencies = [ 32 | "libc", 33 | ] 34 | 35 | [[package]] 36 | name = "anyhow" 37 | version = "1.0.95" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" 40 | 41 | [[package]] 42 | name = "atomic" 43 | version = "0.6.0" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "8d818003e740b63afc82337e3160717f4f63078720a810b7b903e70a5d1d2994" 46 | dependencies = [ 47 | "bytemuck", 48 | ] 49 | 50 | [[package]] 51 | name = "autocfg" 52 | version = "1.4.0" 53 | source = "registry+https://github.com/rust-lang/crates.io-index" 54 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 55 | 56 | [[package]] 57 | name = "base64" 58 | version = "0.21.7" 59 | source = "registry+https://github.com/rust-lang/crates.io-index" 60 | checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 61 | 62 | [[package]] 63 | name = "bit-set" 64 | version = "0.5.3" 65 | source = "registry+https://github.com/rust-lang/crates.io-index" 66 | checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" 67 | dependencies = [ 68 | "bit-vec", 69 | ] 70 | 71 | [[package]] 72 | name = "bit-vec" 73 | version = "0.6.3" 74 | source = "registry+https://github.com/rust-lang/crates.io-index" 75 | checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" 76 | 77 | [[package]] 78 | name = "bitflags" 79 | version = "1.3.2" 80 | source = "registry+https://github.com/rust-lang/crates.io-index" 81 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 82 | 83 | [[package]] 84 | name = "bitflags" 85 | version = "2.6.0" 86 | source = "registry+https://github.com/rust-lang/crates.io-index" 87 | checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" 88 | 89 | [[package]] 90 | name = "block-buffer" 91 | version = "0.10.4" 92 | source = "registry+https://github.com/rust-lang/crates.io-index" 93 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 94 | dependencies = [ 95 | "generic-array", 96 | ] 97 | 98 | [[package]] 99 | name = "bumpalo" 100 | version = "3.16.0" 101 | source = "registry+https://github.com/rust-lang/crates.io-index" 102 | checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 103 | 104 | [[package]] 105 | name = "bytemuck" 106 | version = "1.21.0" 107 | source = "registry+https://github.com/rust-lang/crates.io-index" 108 | checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" 109 | 110 | [[package]] 111 | name = "cassowary" 112 | version = "0.3.0" 113 | source = "registry+https://github.com/rust-lang/crates.io-index" 114 | checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" 115 | 116 | [[package]] 117 | name = "castaway" 118 | version = "0.2.3" 119 | source = "registry+https://github.com/rust-lang/crates.io-index" 120 | checksum = "0abae9be0aaf9ea96a3b1b8b1b55c602ca751eba1b1500220cea4ecbafe7c0d5" 121 | dependencies = [ 122 | "rustversion", 123 | ] 124 | 125 | [[package]] 126 | name = "cc" 127 | version = "1.2.7" 128 | source = "registry+https://github.com/rust-lang/crates.io-index" 129 | checksum = "a012a0df96dd6d06ba9a1b29d6402d1a5d77c6befd2566afdc26e10603dc93d7" 130 | dependencies = [ 131 | "shlex", 132 | ] 133 | 134 | [[package]] 135 | name = "cfg-if" 136 | version = "1.0.0" 137 | source = "registry+https://github.com/rust-lang/crates.io-index" 138 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 139 | 140 | [[package]] 141 | name = "cfg_aliases" 142 | version = "0.1.1" 143 | source = "registry+https://github.com/rust-lang/crates.io-index" 144 | checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" 145 | 146 | [[package]] 147 | name = "chrono" 148 | version = "0.4.39" 149 | source = "registry+https://github.com/rust-lang/crates.io-index" 150 | checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" 151 | dependencies = [ 152 | "android-tzdata", 153 | "iana-time-zone", 154 | "js-sys", 155 | "num-traits", 156 | "wasm-bindgen", 157 | "windows-targets 0.52.6", 158 | ] 159 | 160 | [[package]] 161 | name = "compact_str" 162 | version = "0.8.0" 163 | source = "registry+https://github.com/rust-lang/crates.io-index" 164 | checksum = "6050c3a16ddab2e412160b31f2c871015704239bca62f72f6e5f0be631d3f644" 165 | dependencies = [ 166 | "castaway", 167 | "cfg-if", 168 | "itoa", 169 | "rustversion", 170 | "ryu", 171 | "static_assertions", 172 | ] 173 | 174 | [[package]] 175 | name = "core-foundation-sys" 176 | version = "0.8.7" 177 | source = "registry+https://github.com/rust-lang/crates.io-index" 178 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 179 | 180 | [[package]] 181 | name = "cpufeatures" 182 | version = "0.2.16" 183 | source = "registry+https://github.com/rust-lang/crates.io-index" 184 | checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" 185 | dependencies = [ 186 | "libc", 187 | ] 188 | 189 | [[package]] 190 | name = "crossterm" 191 | version = "0.24.0" 192 | source = "registry+https://github.com/rust-lang/crates.io-index" 193 | checksum = "ab9f7409c70a38a56216480fba371ee460207dd8926ccf5b4160591759559170" 194 | dependencies = [ 195 | "bitflags 1.3.2", 196 | "crossterm_winapi", 197 | "libc", 198 | "mio 0.8.11", 199 | "parking_lot", 200 | "signal-hook", 201 | "signal-hook-mio", 202 | "winapi", 203 | ] 204 | 205 | [[package]] 206 | name = "crossterm" 207 | version = "0.28.1" 208 | source = "registry+https://github.com/rust-lang/crates.io-index" 209 | checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" 210 | dependencies = [ 211 | "bitflags 2.6.0", 212 | "crossterm_winapi", 213 | "mio 1.0.3", 214 | "parking_lot", 215 | "rustix", 216 | "signal-hook", 217 | "signal-hook-mio", 218 | "winapi", 219 | ] 220 | 221 | [[package]] 222 | name = "crossterm_winapi" 223 | version = "0.9.1" 224 | source = "registry+https://github.com/rust-lang/crates.io-index" 225 | checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" 226 | dependencies = [ 227 | "winapi", 228 | ] 229 | 230 | [[package]] 231 | name = "crypto-common" 232 | version = "0.1.6" 233 | source = "registry+https://github.com/rust-lang/crates.io-index" 234 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 235 | dependencies = [ 236 | "generic-array", 237 | "typenum", 238 | ] 239 | 240 | [[package]] 241 | name = "csscolorparser" 242 | version = "0.6.2" 243 | source = "registry+https://github.com/rust-lang/crates.io-index" 244 | checksum = "eb2a7d3066da2de787b7f032c736763eb7ae5d355f81a68bab2675a96008b0bf" 245 | dependencies = [ 246 | "lab", 247 | "phf", 248 | ] 249 | 250 | [[package]] 251 | name = "darling" 252 | version = "0.20.10" 253 | source = "registry+https://github.com/rust-lang/crates.io-index" 254 | checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" 255 | dependencies = [ 256 | "darling_core", 257 | "darling_macro", 258 | ] 259 | 260 | [[package]] 261 | name = "darling_core" 262 | version = "0.20.10" 263 | source = "registry+https://github.com/rust-lang/crates.io-index" 264 | checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" 265 | dependencies = [ 266 | "fnv", 267 | "ident_case", 268 | "proc-macro2", 269 | "quote", 270 | "strsim 0.11.1", 271 | "syn 2.0.93", 272 | ] 273 | 274 | [[package]] 275 | name = "darling_macro" 276 | version = "0.20.10" 277 | source = "registry+https://github.com/rust-lang/crates.io-index" 278 | checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" 279 | dependencies = [ 280 | "darling_core", 281 | "quote", 282 | "syn 2.0.93", 283 | ] 284 | 285 | [[package]] 286 | name = "deltae" 287 | version = "0.3.2" 288 | source = "registry+https://github.com/rust-lang/crates.io-index" 289 | checksum = "5729f5117e208430e437df2f4843f5e5952997175992d1414f94c57d61e270b4" 290 | 291 | [[package]] 292 | name = "deranged" 293 | version = "0.3.11" 294 | source = "registry+https://github.com/rust-lang/crates.io-index" 295 | checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" 296 | dependencies = [ 297 | "powerfmt", 298 | ] 299 | 300 | [[package]] 301 | name = "diff" 302 | version = "0.1.13" 303 | source = "registry+https://github.com/rust-lang/crates.io-index" 304 | checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" 305 | 306 | [[package]] 307 | name = "digest" 308 | version = "0.10.7" 309 | source = "registry+https://github.com/rust-lang/crates.io-index" 310 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 311 | dependencies = [ 312 | "block-buffer", 313 | "crypto-common", 314 | ] 315 | 316 | [[package]] 317 | name = "dirs" 318 | version = "4.0.0" 319 | source = "registry+https://github.com/rust-lang/crates.io-index" 320 | checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" 321 | dependencies = [ 322 | "dirs-sys", 323 | ] 324 | 325 | [[package]] 326 | name = "dirs-sys" 327 | version = "0.3.7" 328 | source = "registry+https://github.com/rust-lang/crates.io-index" 329 | checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" 330 | dependencies = [ 331 | "libc", 332 | "redox_users", 333 | "winapi", 334 | ] 335 | 336 | [[package]] 337 | name = "either" 338 | version = "1.13.0" 339 | source = "registry+https://github.com/rust-lang/crates.io-index" 340 | checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" 341 | 342 | [[package]] 343 | name = "equivalent" 344 | version = "1.0.1" 345 | source = "registry+https://github.com/rust-lang/crates.io-index" 346 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 347 | 348 | [[package]] 349 | name = "errno" 350 | version = "0.3.10" 351 | source = "registry+https://github.com/rust-lang/crates.io-index" 352 | checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" 353 | dependencies = [ 354 | "libc", 355 | "windows-sys 0.59.0", 356 | ] 357 | 358 | [[package]] 359 | name = "euclid" 360 | version = "0.22.11" 361 | source = "registry+https://github.com/rust-lang/crates.io-index" 362 | checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48" 363 | dependencies = [ 364 | "num-traits", 365 | ] 366 | 367 | [[package]] 368 | name = "fancy-regex" 369 | version = "0.11.0" 370 | source = "registry+https://github.com/rust-lang/crates.io-index" 371 | checksum = "b95f7c0680e4142284cf8b22c14a476e87d61b004a3a0861872b32ef7ead40a2" 372 | dependencies = [ 373 | "bit-set", 374 | "regex", 375 | ] 376 | 377 | [[package]] 378 | name = "fastrand" 379 | version = "2.3.0" 380 | source = "registry+https://github.com/rust-lang/crates.io-index" 381 | checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 382 | 383 | [[package]] 384 | name = "filedescriptor" 385 | version = "0.8.2" 386 | source = "registry+https://github.com/rust-lang/crates.io-index" 387 | checksum = "7199d965852c3bac31f779ef99cbb4537f80e952e2d6aa0ffeb30cce00f4f46e" 388 | dependencies = [ 389 | "libc", 390 | "thiserror 1.0.69", 391 | "winapi", 392 | ] 393 | 394 | [[package]] 395 | name = "finl_unicode" 396 | version = "1.3.0" 397 | source = "registry+https://github.com/rust-lang/crates.io-index" 398 | checksum = "94c970b525906eb37d3940083aa65b95e481fc1857d467d13374e1d925cfc163" 399 | 400 | [[package]] 401 | name = "fixedbitset" 402 | version = "0.4.2" 403 | source = "registry+https://github.com/rust-lang/crates.io-index" 404 | checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" 405 | 406 | [[package]] 407 | name = "fnv" 408 | version = "1.0.7" 409 | source = "registry+https://github.com/rust-lang/crates.io-index" 410 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 411 | 412 | [[package]] 413 | name = "foldhash" 414 | version = "0.1.4" 415 | source = "registry+https://github.com/rust-lang/crates.io-index" 416 | checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" 417 | 418 | [[package]] 419 | name = "generic-array" 420 | version = "0.14.7" 421 | source = "registry+https://github.com/rust-lang/crates.io-index" 422 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 423 | dependencies = [ 424 | "typenum", 425 | "version_check", 426 | ] 427 | 428 | [[package]] 429 | name = "getrandom" 430 | version = "0.2.15" 431 | source = "registry+https://github.com/rust-lang/crates.io-index" 432 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 433 | dependencies = [ 434 | "cfg-if", 435 | "libc", 436 | "wasi", 437 | ] 438 | 439 | [[package]] 440 | name = "hashbrown" 441 | version = "0.15.2" 442 | source = "registry+https://github.com/rust-lang/crates.io-index" 443 | checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" 444 | dependencies = [ 445 | "allocator-api2", 446 | "equivalent", 447 | "foldhash", 448 | ] 449 | 450 | [[package]] 451 | name = "heck" 452 | version = "0.5.0" 453 | source = "registry+https://github.com/rust-lang/crates.io-index" 454 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 455 | 456 | [[package]] 457 | name = "hex" 458 | version = "0.4.3" 459 | source = "registry+https://github.com/rust-lang/crates.io-index" 460 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 461 | 462 | [[package]] 463 | name = "iana-time-zone" 464 | version = "0.1.61" 465 | source = "registry+https://github.com/rust-lang/crates.io-index" 466 | checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" 467 | dependencies = [ 468 | "android_system_properties", 469 | "core-foundation-sys", 470 | "iana-time-zone-haiku", 471 | "js-sys", 472 | "wasm-bindgen", 473 | "windows-core", 474 | ] 475 | 476 | [[package]] 477 | name = "iana-time-zone-haiku" 478 | version = "0.1.2" 479 | source = "registry+https://github.com/rust-lang/crates.io-index" 480 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 481 | dependencies = [ 482 | "cc", 483 | ] 484 | 485 | [[package]] 486 | name = "ident_case" 487 | version = "1.0.1" 488 | source = "registry+https://github.com/rust-lang/crates.io-index" 489 | checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 490 | 491 | [[package]] 492 | name = "indoc" 493 | version = "2.0.5" 494 | source = "registry+https://github.com/rust-lang/crates.io-index" 495 | checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" 496 | 497 | [[package]] 498 | name = "instability" 499 | version = "0.3.5" 500 | source = "registry+https://github.com/rust-lang/crates.io-index" 501 | checksum = "898e106451f7335950c9cc64f8ec67b5f65698679ac67ed00619aeef14e1cf75" 502 | dependencies = [ 503 | "darling", 504 | "indoc", 505 | "pretty_assertions", 506 | "proc-macro2", 507 | "quote", 508 | "syn 2.0.93", 509 | ] 510 | 511 | [[package]] 512 | name = "itertools" 513 | version = "0.13.0" 514 | source = "registry+https://github.com/rust-lang/crates.io-index" 515 | checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" 516 | dependencies = [ 517 | "either", 518 | ] 519 | 520 | [[package]] 521 | name = "itoa" 522 | version = "1.0.14" 523 | source = "registry+https://github.com/rust-lang/crates.io-index" 524 | checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" 525 | 526 | [[package]] 527 | name = "journalview" 528 | version = "0.1.0" 529 | dependencies = [ 530 | "chrono", 531 | "crossterm 0.24.0", 532 | "lazy_static", 533 | "log", 534 | "once_cell", 535 | "ratatui", 536 | ] 537 | 538 | [[package]] 539 | name = "js-sys" 540 | version = "0.3.76" 541 | source = "registry+https://github.com/rust-lang/crates.io-index" 542 | checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" 543 | dependencies = [ 544 | "once_cell", 545 | "wasm-bindgen", 546 | ] 547 | 548 | [[package]] 549 | name = "lab" 550 | version = "0.11.0" 551 | source = "registry+https://github.com/rust-lang/crates.io-index" 552 | checksum = "bf36173d4167ed999940f804952e6b08197cae5ad5d572eb4db150ce8ad5d58f" 553 | 554 | [[package]] 555 | name = "lazy_static" 556 | version = "1.5.0" 557 | source = "registry+https://github.com/rust-lang/crates.io-index" 558 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 559 | 560 | [[package]] 561 | name = "libc" 562 | version = "0.2.169" 563 | source = "registry+https://github.com/rust-lang/crates.io-index" 564 | checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" 565 | 566 | [[package]] 567 | name = "libredox" 568 | version = "0.1.3" 569 | source = "registry+https://github.com/rust-lang/crates.io-index" 570 | checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" 571 | dependencies = [ 572 | "bitflags 2.6.0", 573 | "libc", 574 | ] 575 | 576 | [[package]] 577 | name = "line-clipping" 578 | version = "0.2.1" 579 | source = "registry+https://github.com/rust-lang/crates.io-index" 580 | checksum = "76364bf78d7ed059f98564fc5fb94c5a6eb2b6c9edd621cb1528febe1e918b29" 581 | dependencies = [ 582 | "bitflags 2.6.0", 583 | ] 584 | 585 | [[package]] 586 | name = "linux-raw-sys" 587 | version = "0.4.14" 588 | source = "registry+https://github.com/rust-lang/crates.io-index" 589 | checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" 590 | 591 | [[package]] 592 | name = "lock_api" 593 | version = "0.4.12" 594 | source = "registry+https://github.com/rust-lang/crates.io-index" 595 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 596 | dependencies = [ 597 | "autocfg", 598 | "scopeguard", 599 | ] 600 | 601 | [[package]] 602 | name = "log" 603 | version = "0.4.22" 604 | source = "registry+https://github.com/rust-lang/crates.io-index" 605 | checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" 606 | 607 | [[package]] 608 | name = "lru" 609 | version = "0.12.5" 610 | source = "registry+https://github.com/rust-lang/crates.io-index" 611 | checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" 612 | dependencies = [ 613 | "hashbrown", 614 | ] 615 | 616 | [[package]] 617 | name = "mac_address" 618 | version = "1.1.7" 619 | source = "registry+https://github.com/rust-lang/crates.io-index" 620 | checksum = "8836fae9d0d4be2c8b4efcdd79e828a2faa058a90d005abf42f91cac5493a08e" 621 | dependencies = [ 622 | "nix 0.28.0", 623 | "winapi", 624 | ] 625 | 626 | [[package]] 627 | name = "memchr" 628 | version = "2.7.4" 629 | source = "registry+https://github.com/rust-lang/crates.io-index" 630 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 631 | 632 | [[package]] 633 | name = "memmem" 634 | version = "0.1.1" 635 | source = "registry+https://github.com/rust-lang/crates.io-index" 636 | checksum = "a64a92489e2744ce060c349162be1c5f33c6969234104dbd99ddb5feb08b8c15" 637 | 638 | [[package]] 639 | name = "memoffset" 640 | version = "0.7.1" 641 | source = "registry+https://github.com/rust-lang/crates.io-index" 642 | checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" 643 | dependencies = [ 644 | "autocfg", 645 | ] 646 | 647 | [[package]] 648 | name = "memoffset" 649 | version = "0.9.1" 650 | source = "registry+https://github.com/rust-lang/crates.io-index" 651 | checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" 652 | dependencies = [ 653 | "autocfg", 654 | ] 655 | 656 | [[package]] 657 | name = "minimal-lexical" 658 | version = "0.2.1" 659 | source = "registry+https://github.com/rust-lang/crates.io-index" 660 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 661 | 662 | [[package]] 663 | name = "mio" 664 | version = "0.8.11" 665 | source = "registry+https://github.com/rust-lang/crates.io-index" 666 | checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" 667 | dependencies = [ 668 | "libc", 669 | "log", 670 | "wasi", 671 | "windows-sys 0.48.0", 672 | ] 673 | 674 | [[package]] 675 | name = "mio" 676 | version = "1.0.3" 677 | source = "registry+https://github.com/rust-lang/crates.io-index" 678 | checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" 679 | dependencies = [ 680 | "libc", 681 | "log", 682 | "wasi", 683 | "windows-sys 0.52.0", 684 | ] 685 | 686 | [[package]] 687 | name = "nix" 688 | version = "0.26.4" 689 | source = "registry+https://github.com/rust-lang/crates.io-index" 690 | checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" 691 | dependencies = [ 692 | "bitflags 1.3.2", 693 | "cfg-if", 694 | "libc", 695 | "memoffset 0.7.1", 696 | "pin-utils", 697 | ] 698 | 699 | [[package]] 700 | name = "nix" 701 | version = "0.28.0" 702 | source = "registry+https://github.com/rust-lang/crates.io-index" 703 | checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" 704 | dependencies = [ 705 | "bitflags 2.6.0", 706 | "cfg-if", 707 | "cfg_aliases", 708 | "libc", 709 | "memoffset 0.9.1", 710 | ] 711 | 712 | [[package]] 713 | name = "nom" 714 | version = "7.1.3" 715 | source = "registry+https://github.com/rust-lang/crates.io-index" 716 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 717 | dependencies = [ 718 | "memchr", 719 | "minimal-lexical", 720 | ] 721 | 722 | [[package]] 723 | name = "num-conv" 724 | version = "0.1.0" 725 | source = "registry+https://github.com/rust-lang/crates.io-index" 726 | checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 727 | 728 | [[package]] 729 | name = "num-derive" 730 | version = "0.3.3" 731 | source = "registry+https://github.com/rust-lang/crates.io-index" 732 | checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" 733 | dependencies = [ 734 | "proc-macro2", 735 | "quote", 736 | "syn 1.0.109", 737 | ] 738 | 739 | [[package]] 740 | name = "num-traits" 741 | version = "0.2.19" 742 | source = "registry+https://github.com/rust-lang/crates.io-index" 743 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 744 | dependencies = [ 745 | "autocfg", 746 | ] 747 | 748 | [[package]] 749 | name = "num_threads" 750 | version = "0.1.7" 751 | source = "registry+https://github.com/rust-lang/crates.io-index" 752 | checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" 753 | dependencies = [ 754 | "libc", 755 | ] 756 | 757 | [[package]] 758 | name = "once_cell" 759 | version = "1.20.2" 760 | source = "registry+https://github.com/rust-lang/crates.io-index" 761 | checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" 762 | 763 | [[package]] 764 | name = "ordered-float" 765 | version = "4.6.0" 766 | source = "registry+https://github.com/rust-lang/crates.io-index" 767 | checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" 768 | dependencies = [ 769 | "num-traits", 770 | ] 771 | 772 | [[package]] 773 | name = "parking_lot" 774 | version = "0.12.3" 775 | source = "registry+https://github.com/rust-lang/crates.io-index" 776 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 777 | dependencies = [ 778 | "lock_api", 779 | "parking_lot_core", 780 | ] 781 | 782 | [[package]] 783 | name = "parking_lot_core" 784 | version = "0.9.10" 785 | source = "registry+https://github.com/rust-lang/crates.io-index" 786 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 787 | dependencies = [ 788 | "cfg-if", 789 | "libc", 790 | "redox_syscall", 791 | "smallvec", 792 | "windows-targets 0.52.6", 793 | ] 794 | 795 | [[package]] 796 | name = "paste" 797 | version = "1.0.15" 798 | source = "registry+https://github.com/rust-lang/crates.io-index" 799 | checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 800 | 801 | [[package]] 802 | name = "pest" 803 | version = "2.7.15" 804 | source = "registry+https://github.com/rust-lang/crates.io-index" 805 | checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" 806 | dependencies = [ 807 | "memchr", 808 | "thiserror 2.0.9", 809 | "ucd-trie", 810 | ] 811 | 812 | [[package]] 813 | name = "pest_derive" 814 | version = "2.7.15" 815 | source = "registry+https://github.com/rust-lang/crates.io-index" 816 | checksum = "816518421cfc6887a0d62bf441b6ffb4536fcc926395a69e1a85852d4363f57e" 817 | dependencies = [ 818 | "pest", 819 | "pest_generator", 820 | ] 821 | 822 | [[package]] 823 | name = "pest_generator" 824 | version = "2.7.15" 825 | source = "registry+https://github.com/rust-lang/crates.io-index" 826 | checksum = "7d1396fd3a870fc7838768d171b4616d5c91f6cc25e377b673d714567d99377b" 827 | dependencies = [ 828 | "pest", 829 | "pest_meta", 830 | "proc-macro2", 831 | "quote", 832 | "syn 2.0.93", 833 | ] 834 | 835 | [[package]] 836 | name = "pest_meta" 837 | version = "2.7.15" 838 | source = "registry+https://github.com/rust-lang/crates.io-index" 839 | checksum = "e1e58089ea25d717bfd31fb534e4f3afcc2cc569c70de3e239778991ea3b7dea" 840 | dependencies = [ 841 | "once_cell", 842 | "pest", 843 | "sha2", 844 | ] 845 | 846 | [[package]] 847 | name = "phf" 848 | version = "0.11.2" 849 | source = "registry+https://github.com/rust-lang/crates.io-index" 850 | checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" 851 | dependencies = [ 852 | "phf_macros", 853 | "phf_shared", 854 | ] 855 | 856 | [[package]] 857 | name = "phf_codegen" 858 | version = "0.11.2" 859 | source = "registry+https://github.com/rust-lang/crates.io-index" 860 | checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" 861 | dependencies = [ 862 | "phf_generator", 863 | "phf_shared", 864 | ] 865 | 866 | [[package]] 867 | name = "phf_generator" 868 | version = "0.11.2" 869 | source = "registry+https://github.com/rust-lang/crates.io-index" 870 | checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" 871 | dependencies = [ 872 | "phf_shared", 873 | "rand", 874 | ] 875 | 876 | [[package]] 877 | name = "phf_macros" 878 | version = "0.11.2" 879 | source = "registry+https://github.com/rust-lang/crates.io-index" 880 | checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" 881 | dependencies = [ 882 | "phf_generator", 883 | "phf_shared", 884 | "proc-macro2", 885 | "quote", 886 | "syn 2.0.93", 887 | ] 888 | 889 | [[package]] 890 | name = "phf_shared" 891 | version = "0.11.2" 892 | source = "registry+https://github.com/rust-lang/crates.io-index" 893 | checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" 894 | dependencies = [ 895 | "siphasher", 896 | ] 897 | 898 | [[package]] 899 | name = "pin-utils" 900 | version = "0.1.0" 901 | source = "registry+https://github.com/rust-lang/crates.io-index" 902 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 903 | 904 | [[package]] 905 | name = "powerfmt" 906 | version = "0.2.0" 907 | source = "registry+https://github.com/rust-lang/crates.io-index" 908 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 909 | 910 | [[package]] 911 | name = "pretty_assertions" 912 | version = "1.4.1" 913 | source = "registry+https://github.com/rust-lang/crates.io-index" 914 | checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" 915 | dependencies = [ 916 | "diff", 917 | "yansi", 918 | ] 919 | 920 | [[package]] 921 | name = "proc-macro2" 922 | version = "1.0.92" 923 | source = "registry+https://github.com/rust-lang/crates.io-index" 924 | checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" 925 | dependencies = [ 926 | "unicode-ident", 927 | ] 928 | 929 | [[package]] 930 | name = "quote" 931 | version = "1.0.38" 932 | source = "registry+https://github.com/rust-lang/crates.io-index" 933 | checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" 934 | dependencies = [ 935 | "proc-macro2", 936 | ] 937 | 938 | [[package]] 939 | name = "rand" 940 | version = "0.8.5" 941 | source = "registry+https://github.com/rust-lang/crates.io-index" 942 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 943 | dependencies = [ 944 | "rand_core", 945 | ] 946 | 947 | [[package]] 948 | name = "rand_core" 949 | version = "0.6.4" 950 | source = "registry+https://github.com/rust-lang/crates.io-index" 951 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 952 | 953 | [[package]] 954 | name = "ratatui" 955 | version = "0.30.0-alpha.0" 956 | source = "registry+https://github.com/rust-lang/crates.io-index" 957 | checksum = "646917ffed1f59ad25201003baf411b43b9ea9f783d5f658d76e60ee3177e07f" 958 | dependencies = [ 959 | "indoc", 960 | "instability", 961 | "itertools", 962 | "ratatui-core", 963 | "ratatui-crossterm", 964 | "ratatui-termwiz", 965 | "ratatui-widgets", 966 | "strum", 967 | "time", 968 | "unicode-width", 969 | ] 970 | 971 | [[package]] 972 | name = "ratatui-core" 973 | version = "0.1.0-alpha.0" 974 | source = "registry+https://github.com/rust-lang/crates.io-index" 975 | checksum = "e2425e6b9033821bed6d286418dfa5d455f7986726b68ed20212fd985f4c1958" 976 | dependencies = [ 977 | "bitflags 2.6.0", 978 | "cassowary", 979 | "compact_str", 980 | "indoc", 981 | "itertools", 982 | "lru", 983 | "paste", 984 | "strum", 985 | "unicode-segmentation", 986 | "unicode-truncate", 987 | "unicode-width", 988 | ] 989 | 990 | [[package]] 991 | name = "ratatui-crossterm" 992 | version = "0.1.0-alpha.0" 993 | source = "registry+https://github.com/rust-lang/crates.io-index" 994 | checksum = "1f66ddacd530502e6f35cad9c72ecc42273a5ed7c9499e5308e3461b3502f54d" 995 | dependencies = [ 996 | "crossterm 0.28.1", 997 | "instability", 998 | "ratatui-core", 999 | ] 1000 | 1001 | [[package]] 1002 | name = "ratatui-termwiz" 1003 | version = "0.1.0-alpha.0" 1004 | source = "registry+https://github.com/rust-lang/crates.io-index" 1005 | checksum = "13eeec6a11d29b779ac79bbab18d13859a7094977a4a0c7130d7e5f382f0061c" 1006 | dependencies = [ 1007 | "ratatui-core", 1008 | "termwiz", 1009 | ] 1010 | 1011 | [[package]] 1012 | name = "ratatui-widgets" 1013 | version = "0.3.0-alpha.0" 1014 | source = "registry+https://github.com/rust-lang/crates.io-index" 1015 | checksum = "9457a5e5f4016f191c572b9a24a326215e0fbfb004c01223bbfd14d298e6496a" 1016 | dependencies = [ 1017 | "bitflags 2.6.0", 1018 | "indoc", 1019 | "instability", 1020 | "itertools", 1021 | "line-clipping", 1022 | "ratatui-core", 1023 | "strum", 1024 | "time", 1025 | "unicode-segmentation", 1026 | "unicode-width", 1027 | ] 1028 | 1029 | [[package]] 1030 | name = "redox_syscall" 1031 | version = "0.5.8" 1032 | source = "registry+https://github.com/rust-lang/crates.io-index" 1033 | checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" 1034 | dependencies = [ 1035 | "bitflags 2.6.0", 1036 | ] 1037 | 1038 | [[package]] 1039 | name = "redox_users" 1040 | version = "0.4.6" 1041 | source = "registry+https://github.com/rust-lang/crates.io-index" 1042 | checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" 1043 | dependencies = [ 1044 | "getrandom", 1045 | "libredox", 1046 | "thiserror 1.0.69", 1047 | ] 1048 | 1049 | [[package]] 1050 | name = "regex" 1051 | version = "1.11.1" 1052 | source = "registry+https://github.com/rust-lang/crates.io-index" 1053 | checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 1054 | dependencies = [ 1055 | "aho-corasick", 1056 | "memchr", 1057 | "regex-automata", 1058 | "regex-syntax", 1059 | ] 1060 | 1061 | [[package]] 1062 | name = "regex-automata" 1063 | version = "0.4.9" 1064 | source = "registry+https://github.com/rust-lang/crates.io-index" 1065 | checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 1066 | dependencies = [ 1067 | "aho-corasick", 1068 | "memchr", 1069 | "regex-syntax", 1070 | ] 1071 | 1072 | [[package]] 1073 | name = "regex-syntax" 1074 | version = "0.8.5" 1075 | source = "registry+https://github.com/rust-lang/crates.io-index" 1076 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 1077 | 1078 | [[package]] 1079 | name = "rustix" 1080 | version = "0.38.42" 1081 | source = "registry+https://github.com/rust-lang/crates.io-index" 1082 | checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" 1083 | dependencies = [ 1084 | "bitflags 2.6.0", 1085 | "errno", 1086 | "libc", 1087 | "linux-raw-sys", 1088 | "windows-sys 0.59.0", 1089 | ] 1090 | 1091 | [[package]] 1092 | name = "rustversion" 1093 | version = "1.0.19" 1094 | source = "registry+https://github.com/rust-lang/crates.io-index" 1095 | checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" 1096 | 1097 | [[package]] 1098 | name = "ryu" 1099 | version = "1.0.18" 1100 | source = "registry+https://github.com/rust-lang/crates.io-index" 1101 | checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" 1102 | 1103 | [[package]] 1104 | name = "scopeguard" 1105 | version = "1.2.0" 1106 | source = "registry+https://github.com/rust-lang/crates.io-index" 1107 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1108 | 1109 | [[package]] 1110 | name = "semver" 1111 | version = "0.11.0" 1112 | source = "registry+https://github.com/rust-lang/crates.io-index" 1113 | checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" 1114 | dependencies = [ 1115 | "semver-parser", 1116 | ] 1117 | 1118 | [[package]] 1119 | name = "semver-parser" 1120 | version = "0.10.3" 1121 | source = "registry+https://github.com/rust-lang/crates.io-index" 1122 | checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" 1123 | dependencies = [ 1124 | "pest", 1125 | ] 1126 | 1127 | [[package]] 1128 | name = "serde" 1129 | version = "1.0.217" 1130 | source = "registry+https://github.com/rust-lang/crates.io-index" 1131 | checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" 1132 | dependencies = [ 1133 | "serde_derive", 1134 | ] 1135 | 1136 | [[package]] 1137 | name = "serde_derive" 1138 | version = "1.0.217" 1139 | source = "registry+https://github.com/rust-lang/crates.io-index" 1140 | checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" 1141 | dependencies = [ 1142 | "proc-macro2", 1143 | "quote", 1144 | "syn 2.0.93", 1145 | ] 1146 | 1147 | [[package]] 1148 | name = "sha2" 1149 | version = "0.10.8" 1150 | source = "registry+https://github.com/rust-lang/crates.io-index" 1151 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 1152 | dependencies = [ 1153 | "cfg-if", 1154 | "cpufeatures", 1155 | "digest", 1156 | ] 1157 | 1158 | [[package]] 1159 | name = "shlex" 1160 | version = "1.3.0" 1161 | source = "registry+https://github.com/rust-lang/crates.io-index" 1162 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1163 | 1164 | [[package]] 1165 | name = "signal-hook" 1166 | version = "0.3.17" 1167 | source = "registry+https://github.com/rust-lang/crates.io-index" 1168 | checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" 1169 | dependencies = [ 1170 | "libc", 1171 | "signal-hook-registry", 1172 | ] 1173 | 1174 | [[package]] 1175 | name = "signal-hook-mio" 1176 | version = "0.2.4" 1177 | source = "registry+https://github.com/rust-lang/crates.io-index" 1178 | checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" 1179 | dependencies = [ 1180 | "libc", 1181 | "mio 0.8.11", 1182 | "mio 1.0.3", 1183 | "signal-hook", 1184 | ] 1185 | 1186 | [[package]] 1187 | name = "signal-hook-registry" 1188 | version = "1.4.2" 1189 | source = "registry+https://github.com/rust-lang/crates.io-index" 1190 | checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" 1191 | dependencies = [ 1192 | "libc", 1193 | ] 1194 | 1195 | [[package]] 1196 | name = "siphasher" 1197 | version = "0.3.11" 1198 | source = "registry+https://github.com/rust-lang/crates.io-index" 1199 | checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" 1200 | 1201 | [[package]] 1202 | name = "smallvec" 1203 | version = "1.13.2" 1204 | source = "registry+https://github.com/rust-lang/crates.io-index" 1205 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 1206 | 1207 | [[package]] 1208 | name = "static_assertions" 1209 | version = "1.1.0" 1210 | source = "registry+https://github.com/rust-lang/crates.io-index" 1211 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 1212 | 1213 | [[package]] 1214 | name = "strsim" 1215 | version = "0.10.0" 1216 | source = "registry+https://github.com/rust-lang/crates.io-index" 1217 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 1218 | 1219 | [[package]] 1220 | name = "strsim" 1221 | version = "0.11.1" 1222 | source = "registry+https://github.com/rust-lang/crates.io-index" 1223 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 1224 | 1225 | [[package]] 1226 | name = "strum" 1227 | version = "0.26.3" 1228 | source = "registry+https://github.com/rust-lang/crates.io-index" 1229 | checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" 1230 | dependencies = [ 1231 | "strum_macros", 1232 | ] 1233 | 1234 | [[package]] 1235 | name = "strum_macros" 1236 | version = "0.26.4" 1237 | source = "registry+https://github.com/rust-lang/crates.io-index" 1238 | checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" 1239 | dependencies = [ 1240 | "heck", 1241 | "proc-macro2", 1242 | "quote", 1243 | "rustversion", 1244 | "syn 2.0.93", 1245 | ] 1246 | 1247 | [[package]] 1248 | name = "syn" 1249 | version = "1.0.109" 1250 | source = "registry+https://github.com/rust-lang/crates.io-index" 1251 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 1252 | dependencies = [ 1253 | "proc-macro2", 1254 | "quote", 1255 | "unicode-ident", 1256 | ] 1257 | 1258 | [[package]] 1259 | name = "syn" 1260 | version = "2.0.93" 1261 | source = "registry+https://github.com/rust-lang/crates.io-index" 1262 | checksum = "9c786062daee0d6db1132800e623df74274a0a87322d8e183338e01b3d98d058" 1263 | dependencies = [ 1264 | "proc-macro2", 1265 | "quote", 1266 | "unicode-ident", 1267 | ] 1268 | 1269 | [[package]] 1270 | name = "tempfile" 1271 | version = "3.14.0" 1272 | source = "registry+https://github.com/rust-lang/crates.io-index" 1273 | checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" 1274 | dependencies = [ 1275 | "cfg-if", 1276 | "fastrand", 1277 | "once_cell", 1278 | "rustix", 1279 | "windows-sys 0.59.0", 1280 | ] 1281 | 1282 | [[package]] 1283 | name = "terminfo" 1284 | version = "0.8.0" 1285 | source = "registry+https://github.com/rust-lang/crates.io-index" 1286 | checksum = "666cd3a6681775d22b200409aad3b089c5b99fb11ecdd8a204d9d62f8148498f" 1287 | dependencies = [ 1288 | "dirs", 1289 | "fnv", 1290 | "nom", 1291 | "phf", 1292 | "phf_codegen", 1293 | ] 1294 | 1295 | [[package]] 1296 | name = "termios" 1297 | version = "0.3.3" 1298 | source = "registry+https://github.com/rust-lang/crates.io-index" 1299 | checksum = "411c5bf740737c7918b8b1fe232dca4dc9f8e754b8ad5e20966814001ed0ac6b" 1300 | dependencies = [ 1301 | "libc", 1302 | ] 1303 | 1304 | [[package]] 1305 | name = "termwiz" 1306 | version = "0.22.0" 1307 | source = "registry+https://github.com/rust-lang/crates.io-index" 1308 | checksum = "5a75313e21da5d4406ea31402035b3b97aa74c04356bdfafa5d1043ab4e551d1" 1309 | dependencies = [ 1310 | "anyhow", 1311 | "base64", 1312 | "bitflags 2.6.0", 1313 | "fancy-regex", 1314 | "filedescriptor", 1315 | "finl_unicode", 1316 | "fixedbitset", 1317 | "hex", 1318 | "lazy_static", 1319 | "libc", 1320 | "log", 1321 | "memmem", 1322 | "nix 0.26.4", 1323 | "num-derive", 1324 | "num-traits", 1325 | "ordered-float", 1326 | "pest", 1327 | "pest_derive", 1328 | "phf", 1329 | "semver", 1330 | "sha2", 1331 | "signal-hook", 1332 | "siphasher", 1333 | "tempfile", 1334 | "terminfo", 1335 | "termios", 1336 | "thiserror 1.0.69", 1337 | "ucd-trie", 1338 | "unicode-segmentation", 1339 | "vtparse", 1340 | "wezterm-bidi", 1341 | "wezterm-blob-leases", 1342 | "wezterm-color-types", 1343 | "wezterm-dynamic", 1344 | "wezterm-input-types", 1345 | "winapi", 1346 | ] 1347 | 1348 | [[package]] 1349 | name = "thiserror" 1350 | version = "1.0.69" 1351 | source = "registry+https://github.com/rust-lang/crates.io-index" 1352 | checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 1353 | dependencies = [ 1354 | "thiserror-impl 1.0.69", 1355 | ] 1356 | 1357 | [[package]] 1358 | name = "thiserror" 1359 | version = "2.0.9" 1360 | source = "registry+https://github.com/rust-lang/crates.io-index" 1361 | checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" 1362 | dependencies = [ 1363 | "thiserror-impl 2.0.9", 1364 | ] 1365 | 1366 | [[package]] 1367 | name = "thiserror-impl" 1368 | version = "1.0.69" 1369 | source = "registry+https://github.com/rust-lang/crates.io-index" 1370 | checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 1371 | dependencies = [ 1372 | "proc-macro2", 1373 | "quote", 1374 | "syn 2.0.93", 1375 | ] 1376 | 1377 | [[package]] 1378 | name = "thiserror-impl" 1379 | version = "2.0.9" 1380 | source = "registry+https://github.com/rust-lang/crates.io-index" 1381 | checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" 1382 | dependencies = [ 1383 | "proc-macro2", 1384 | "quote", 1385 | "syn 2.0.93", 1386 | ] 1387 | 1388 | [[package]] 1389 | name = "time" 1390 | version = "0.3.37" 1391 | source = "registry+https://github.com/rust-lang/crates.io-index" 1392 | checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" 1393 | dependencies = [ 1394 | "deranged", 1395 | "libc", 1396 | "num-conv", 1397 | "num_threads", 1398 | "powerfmt", 1399 | "serde", 1400 | "time-core", 1401 | ] 1402 | 1403 | [[package]] 1404 | name = "time-core" 1405 | version = "0.1.2" 1406 | source = "registry+https://github.com/rust-lang/crates.io-index" 1407 | checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" 1408 | 1409 | [[package]] 1410 | name = "typenum" 1411 | version = "1.17.0" 1412 | source = "registry+https://github.com/rust-lang/crates.io-index" 1413 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 1414 | 1415 | [[package]] 1416 | name = "ucd-trie" 1417 | version = "0.1.7" 1418 | source = "registry+https://github.com/rust-lang/crates.io-index" 1419 | checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" 1420 | 1421 | [[package]] 1422 | name = "unicode-ident" 1423 | version = "1.0.14" 1424 | source = "registry+https://github.com/rust-lang/crates.io-index" 1425 | checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" 1426 | 1427 | [[package]] 1428 | name = "unicode-segmentation" 1429 | version = "1.12.0" 1430 | source = "registry+https://github.com/rust-lang/crates.io-index" 1431 | checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" 1432 | 1433 | [[package]] 1434 | name = "unicode-truncate" 1435 | version = "2.0.0" 1436 | source = "registry+https://github.com/rust-lang/crates.io-index" 1437 | checksum = "8fbf03860ff438702f3910ca5f28f8dac63c1c11e7efb5012b8b175493606330" 1438 | dependencies = [ 1439 | "itertools", 1440 | "unicode-segmentation", 1441 | "unicode-width", 1442 | ] 1443 | 1444 | [[package]] 1445 | name = "unicode-width" 1446 | version = "0.2.0" 1447 | source = "registry+https://github.com/rust-lang/crates.io-index" 1448 | checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" 1449 | 1450 | [[package]] 1451 | name = "utf8parse" 1452 | version = "0.2.2" 1453 | source = "registry+https://github.com/rust-lang/crates.io-index" 1454 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 1455 | 1456 | [[package]] 1457 | name = "uuid" 1458 | version = "1.11.0" 1459 | source = "registry+https://github.com/rust-lang/crates.io-index" 1460 | checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" 1461 | dependencies = [ 1462 | "atomic", 1463 | "getrandom", 1464 | ] 1465 | 1466 | [[package]] 1467 | name = "version_check" 1468 | version = "0.9.5" 1469 | source = "registry+https://github.com/rust-lang/crates.io-index" 1470 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 1471 | 1472 | [[package]] 1473 | name = "vtparse" 1474 | version = "0.6.2" 1475 | source = "registry+https://github.com/rust-lang/crates.io-index" 1476 | checksum = "6d9b2acfb050df409c972a37d3b8e08cdea3bddb0c09db9d53137e504cfabed0" 1477 | dependencies = [ 1478 | "utf8parse", 1479 | ] 1480 | 1481 | [[package]] 1482 | name = "wasi" 1483 | version = "0.11.0+wasi-snapshot-preview1" 1484 | source = "registry+https://github.com/rust-lang/crates.io-index" 1485 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1486 | 1487 | [[package]] 1488 | name = "wasm-bindgen" 1489 | version = "0.2.99" 1490 | source = "registry+https://github.com/rust-lang/crates.io-index" 1491 | checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" 1492 | dependencies = [ 1493 | "cfg-if", 1494 | "once_cell", 1495 | "wasm-bindgen-macro", 1496 | ] 1497 | 1498 | [[package]] 1499 | name = "wasm-bindgen-backend" 1500 | version = "0.2.99" 1501 | source = "registry+https://github.com/rust-lang/crates.io-index" 1502 | checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" 1503 | dependencies = [ 1504 | "bumpalo", 1505 | "log", 1506 | "proc-macro2", 1507 | "quote", 1508 | "syn 2.0.93", 1509 | "wasm-bindgen-shared", 1510 | ] 1511 | 1512 | [[package]] 1513 | name = "wasm-bindgen-macro" 1514 | version = "0.2.99" 1515 | source = "registry+https://github.com/rust-lang/crates.io-index" 1516 | checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" 1517 | dependencies = [ 1518 | "quote", 1519 | "wasm-bindgen-macro-support", 1520 | ] 1521 | 1522 | [[package]] 1523 | name = "wasm-bindgen-macro-support" 1524 | version = "0.2.99" 1525 | source = "registry+https://github.com/rust-lang/crates.io-index" 1526 | checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" 1527 | dependencies = [ 1528 | "proc-macro2", 1529 | "quote", 1530 | "syn 2.0.93", 1531 | "wasm-bindgen-backend", 1532 | "wasm-bindgen-shared", 1533 | ] 1534 | 1535 | [[package]] 1536 | name = "wasm-bindgen-shared" 1537 | version = "0.2.99" 1538 | source = "registry+https://github.com/rust-lang/crates.io-index" 1539 | checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" 1540 | 1541 | [[package]] 1542 | name = "wezterm-bidi" 1543 | version = "0.2.3" 1544 | source = "registry+https://github.com/rust-lang/crates.io-index" 1545 | checksum = "0c0a6e355560527dd2d1cf7890652f4f09bb3433b6aadade4c9b5ed76de5f3ec" 1546 | dependencies = [ 1547 | "log", 1548 | "wezterm-dynamic", 1549 | ] 1550 | 1551 | [[package]] 1552 | name = "wezterm-blob-leases" 1553 | version = "0.1.0" 1554 | source = "registry+https://github.com/rust-lang/crates.io-index" 1555 | checksum = "8e5a5e0adf7eed68976410def849a4bdab6f6e9f6163f152de9cb89deea9e60b" 1556 | dependencies = [ 1557 | "getrandom", 1558 | "mac_address", 1559 | "once_cell", 1560 | "sha2", 1561 | "thiserror 1.0.69", 1562 | "uuid", 1563 | ] 1564 | 1565 | [[package]] 1566 | name = "wezterm-color-types" 1567 | version = "0.3.0" 1568 | source = "registry+https://github.com/rust-lang/crates.io-index" 1569 | checksum = "7de81ef35c9010270d63772bebef2f2d6d1f2d20a983d27505ac850b8c4b4296" 1570 | dependencies = [ 1571 | "csscolorparser", 1572 | "deltae", 1573 | "lazy_static", 1574 | "wezterm-dynamic", 1575 | ] 1576 | 1577 | [[package]] 1578 | name = "wezterm-dynamic" 1579 | version = "0.2.0" 1580 | source = "registry+https://github.com/rust-lang/crates.io-index" 1581 | checksum = "dfb128bacfa86734e07681fb6068e34c144698e84ee022d6e009145d1abb77b5" 1582 | dependencies = [ 1583 | "log", 1584 | "ordered-float", 1585 | "strsim 0.10.0", 1586 | "thiserror 1.0.69", 1587 | "wezterm-dynamic-derive", 1588 | ] 1589 | 1590 | [[package]] 1591 | name = "wezterm-dynamic-derive" 1592 | version = "0.1.0" 1593 | source = "registry+https://github.com/rust-lang/crates.io-index" 1594 | checksum = "0c9f5ef318442d07b3d071f9f43ea40b80992f87faee14bb4d017b6991c307f0" 1595 | dependencies = [ 1596 | "proc-macro2", 1597 | "quote", 1598 | "syn 1.0.109", 1599 | ] 1600 | 1601 | [[package]] 1602 | name = "wezterm-input-types" 1603 | version = "0.1.0" 1604 | source = "registry+https://github.com/rust-lang/crates.io-index" 1605 | checksum = "7012add459f951456ec9d6c7e6fc340b1ce15d6fc9629f8c42853412c029e57e" 1606 | dependencies = [ 1607 | "bitflags 1.3.2", 1608 | "euclid", 1609 | "lazy_static", 1610 | "wezterm-dynamic", 1611 | ] 1612 | 1613 | [[package]] 1614 | name = "winapi" 1615 | version = "0.3.9" 1616 | source = "registry+https://github.com/rust-lang/crates.io-index" 1617 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1618 | dependencies = [ 1619 | "winapi-i686-pc-windows-gnu", 1620 | "winapi-x86_64-pc-windows-gnu", 1621 | ] 1622 | 1623 | [[package]] 1624 | name = "winapi-i686-pc-windows-gnu" 1625 | version = "0.4.0" 1626 | source = "registry+https://github.com/rust-lang/crates.io-index" 1627 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1628 | 1629 | [[package]] 1630 | name = "winapi-x86_64-pc-windows-gnu" 1631 | version = "0.4.0" 1632 | source = "registry+https://github.com/rust-lang/crates.io-index" 1633 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1634 | 1635 | [[package]] 1636 | name = "windows-core" 1637 | version = "0.52.0" 1638 | source = "registry+https://github.com/rust-lang/crates.io-index" 1639 | checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 1640 | dependencies = [ 1641 | "windows-targets 0.52.6", 1642 | ] 1643 | 1644 | [[package]] 1645 | name = "windows-sys" 1646 | version = "0.48.0" 1647 | source = "registry+https://github.com/rust-lang/crates.io-index" 1648 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 1649 | dependencies = [ 1650 | "windows-targets 0.48.5", 1651 | ] 1652 | 1653 | [[package]] 1654 | name = "windows-sys" 1655 | version = "0.52.0" 1656 | source = "registry+https://github.com/rust-lang/crates.io-index" 1657 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1658 | dependencies = [ 1659 | "windows-targets 0.52.6", 1660 | ] 1661 | 1662 | [[package]] 1663 | name = "windows-sys" 1664 | version = "0.59.0" 1665 | source = "registry+https://github.com/rust-lang/crates.io-index" 1666 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 1667 | dependencies = [ 1668 | "windows-targets 0.52.6", 1669 | ] 1670 | 1671 | [[package]] 1672 | name = "windows-targets" 1673 | version = "0.48.5" 1674 | source = "registry+https://github.com/rust-lang/crates.io-index" 1675 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 1676 | dependencies = [ 1677 | "windows_aarch64_gnullvm 0.48.5", 1678 | "windows_aarch64_msvc 0.48.5", 1679 | "windows_i686_gnu 0.48.5", 1680 | "windows_i686_msvc 0.48.5", 1681 | "windows_x86_64_gnu 0.48.5", 1682 | "windows_x86_64_gnullvm 0.48.5", 1683 | "windows_x86_64_msvc 0.48.5", 1684 | ] 1685 | 1686 | [[package]] 1687 | name = "windows-targets" 1688 | version = "0.52.6" 1689 | source = "registry+https://github.com/rust-lang/crates.io-index" 1690 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 1691 | dependencies = [ 1692 | "windows_aarch64_gnullvm 0.52.6", 1693 | "windows_aarch64_msvc 0.52.6", 1694 | "windows_i686_gnu 0.52.6", 1695 | "windows_i686_gnullvm", 1696 | "windows_i686_msvc 0.52.6", 1697 | "windows_x86_64_gnu 0.52.6", 1698 | "windows_x86_64_gnullvm 0.52.6", 1699 | "windows_x86_64_msvc 0.52.6", 1700 | ] 1701 | 1702 | [[package]] 1703 | name = "windows_aarch64_gnullvm" 1704 | version = "0.48.5" 1705 | source = "registry+https://github.com/rust-lang/crates.io-index" 1706 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 1707 | 1708 | [[package]] 1709 | name = "windows_aarch64_gnullvm" 1710 | version = "0.52.6" 1711 | source = "registry+https://github.com/rust-lang/crates.io-index" 1712 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 1713 | 1714 | [[package]] 1715 | name = "windows_aarch64_msvc" 1716 | version = "0.48.5" 1717 | source = "registry+https://github.com/rust-lang/crates.io-index" 1718 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 1719 | 1720 | [[package]] 1721 | name = "windows_aarch64_msvc" 1722 | version = "0.52.6" 1723 | source = "registry+https://github.com/rust-lang/crates.io-index" 1724 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 1725 | 1726 | [[package]] 1727 | name = "windows_i686_gnu" 1728 | version = "0.48.5" 1729 | source = "registry+https://github.com/rust-lang/crates.io-index" 1730 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 1731 | 1732 | [[package]] 1733 | name = "windows_i686_gnu" 1734 | version = "0.52.6" 1735 | source = "registry+https://github.com/rust-lang/crates.io-index" 1736 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 1737 | 1738 | [[package]] 1739 | name = "windows_i686_gnullvm" 1740 | version = "0.52.6" 1741 | source = "registry+https://github.com/rust-lang/crates.io-index" 1742 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 1743 | 1744 | [[package]] 1745 | name = "windows_i686_msvc" 1746 | version = "0.48.5" 1747 | source = "registry+https://github.com/rust-lang/crates.io-index" 1748 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 1749 | 1750 | [[package]] 1751 | name = "windows_i686_msvc" 1752 | version = "0.52.6" 1753 | source = "registry+https://github.com/rust-lang/crates.io-index" 1754 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 1755 | 1756 | [[package]] 1757 | name = "windows_x86_64_gnu" 1758 | version = "0.48.5" 1759 | source = "registry+https://github.com/rust-lang/crates.io-index" 1760 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 1761 | 1762 | [[package]] 1763 | name = "windows_x86_64_gnu" 1764 | version = "0.52.6" 1765 | source = "registry+https://github.com/rust-lang/crates.io-index" 1766 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 1767 | 1768 | [[package]] 1769 | name = "windows_x86_64_gnullvm" 1770 | version = "0.48.5" 1771 | source = "registry+https://github.com/rust-lang/crates.io-index" 1772 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 1773 | 1774 | [[package]] 1775 | name = "windows_x86_64_gnullvm" 1776 | version = "0.52.6" 1777 | source = "registry+https://github.com/rust-lang/crates.io-index" 1778 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 1779 | 1780 | [[package]] 1781 | name = "windows_x86_64_msvc" 1782 | version = "0.48.5" 1783 | source = "registry+https://github.com/rust-lang/crates.io-index" 1784 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 1785 | 1786 | [[package]] 1787 | name = "windows_x86_64_msvc" 1788 | version = "0.52.6" 1789 | source = "registry+https://github.com/rust-lang/crates.io-index" 1790 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 1791 | 1792 | [[package]] 1793 | name = "yansi" 1794 | version = "1.0.1" 1795 | source = "registry+https://github.com/rust-lang/crates.io-index" 1796 | checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" 1797 | --------------------------------------------------------------------------------