GitWatcher

Struct GitWatcher 

Source
pub struct GitWatcher { /* private fields */ }
Expand description

A git watcher for detecting git repository state changes.

Uses the notify crate internally to watch the .git directory for changes. Provides a non-blocking interface suitable for use in TUI event loops.

This is useful for caching git statistics and only recomputing them when the git state actually changes, rather than polling at a fixed interval.

Implementations§

Source§

impl GitWatcher

Source

pub fn new() -> Result<Self, Error>

Create a new git watcher with default configuration.

Uses 100ms debounce by default.

§Errors

Returns a notify::Error if the watcher cannot be created.

§Example
use ratatui_toolkit::services::git_watcher::GitWatcher;

let watcher = GitWatcher::new().unwrap();
Source§

impl GitWatcher

Source

pub fn with_config(config: GitWatchConfig) -> Result<Self, Error>

Create a new git watcher with custom configuration.

§Arguments
  • config - Configuration for the watcher.
§Errors

Returns a notify::Error if the watcher cannot be created.

§Example
use ratatui_toolkit::services::git_watcher::{GitWatcher, GitWatchConfig};

let config = GitWatchConfig::new()
    .debounce_ms(200);

let watcher = GitWatcher::with_config(config).unwrap();
Source§

impl GitWatcher

Source

pub fn check_for_changes(&mut self) -> bool

Check if there are any pending git state changes.

This is a non-blocking operation that returns true if any relevant git changes have been detected since the last check.

§Returns

true if git changes were detected, false otherwise.

§Example
use ratatui_toolkit::services::git_watcher::GitWatcher;
use std::path::Path;

let mut watcher = GitWatcher::new().unwrap();
watcher.watch(Path::new("/path/to/repo")).unwrap();

// In your event loop:
if watcher.check_for_changes() {
    println!("Git state changed, recompute stats!");
}
Source

pub fn has_pending_changes(&self) -> bool

Check if there are pending changes without consuming them.

This is useful when you want to know if there are changes but don’t want to reset the flag yet.

§Returns

true if git changes are pending, false otherwise.

Source§

impl GitWatcher

Source

pub fn drain_events(&mut self)

Drain all pending events without processing them.

This clears the event queue and resets the pending changes flag, useful when you want to ignore accumulated changes (e.g., after a batch operation).

§Example
use ratatui_toolkit::services::git_watcher::GitWatcher;
use std::path::Path;

let mut watcher = GitWatcher::new().unwrap();
watcher.watch(Path::new("/path/to/repo")).unwrap();

// After some operation that causes many changes:
watcher.drain_events();
Source§

impl GitWatcher

Source

pub fn unwatch(&mut self, repo_path: &Path) -> Result<(), Error>

Stop watching a git repository.

§Arguments
  • repo_path - Path to the repository root (where .git is located).
§Errors

Returns a notify::Error if the path cannot be unwatched.

§Example
use ratatui_toolkit::services::git_watcher::GitWatcher;
use std::path::Path;

let mut watcher = GitWatcher::new().unwrap();
let path = Path::new("/path/to/repo");
watcher.watch(path).unwrap();
// Later...
watcher.unwatch(path).unwrap();
Source§

impl GitWatcher

Source

pub fn watch(&mut self, repo_path: &Path) -> Result<(), Error>

Start watching a git repository for changes.

Watches the .git directory recursively to detect any changes to the repository state (commits, staging, branches, etc.).

§Arguments
  • repo_path - Path to the repository root (where .git is located).
§Errors

Returns a notify::Error if the path cannot be watched or if the .git directory doesn’t exist.

§Example
use ratatui_toolkit::services::git_watcher::GitWatcher;
use std::path::Path;

let mut watcher = GitWatcher::new().unwrap();
watcher.watch(Path::new("/path/to/repo")).unwrap();

Trait Implementations§

Source§

impl Debug for GitWatcher

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more