pub struct CacheManager { /* private fields */ }Expand description
Manages cache directory and cache file operations
Implementations§
Source§impl CacheManager
impl CacheManager
Sourcepub fn with_dir(cache_dir: PathBuf) -> Self
pub fn with_dir(cache_dir: PathBuf) -> Self
Create a new CacheManager for the given app name Create a CacheManager rooted at an explicit directory (primarily for testing).
Sourcepub fn new(app_name: &str) -> Result<Self>
pub fn new(app_name: &str) -> Result<Self>
Create a CacheManager for the given app name.
DATUI_CACHE_DIR overrides the location. The test suite sets it, because
opening a dataset records it as recent — without the override a test run
writes its fixtures into the developer’s own recent-files list.
Sourcepub fn cache_file(&self, filename: &str) -> PathBuf
pub fn cache_file(&self, filename: &str) -> PathBuf
Get path to a specific cache file
Sourcepub fn ensure_cache_dir(&self) -> Result<()>
pub fn ensure_cache_dir(&self) -> Result<()>
Ensure the cache directory exists
Sourcepub fn clear_file(&self, filename: &str) -> Result<()>
pub fn clear_file(&self, filename: &str) -> Result<()>
Clear a specific cache file
Sourcepub fn clear_all(&self) -> Result<()>
pub fn clear_all(&self) -> Result<()>
Remove every cache kind’s directory and every line-file list (recents, histories, hidden sources, remembered places).
Nothing else: lock files may be held by another instance, the log is not a cache, and Data Quality’s copies belong to the sessions holding them. Views live in the config directory.
Sourcepub fn load_history_file(&self, history_id: &str) -> Result<Vec<String>>
pub fn load_history_file(&self, history_id: &str) -> Result<Vec<String>>
Load history from a history file.
A file that cannot be read is an error, never an empty list: an empty list would be written back by the next push, and every entry would be gone. A line that is not UTF-8 is skipped alone, so one bad byte costs one entry.
Sourcepub fn update_history_file<F>(
&self,
history_id: &str,
update: F,
) -> Result<HistoryUpdate>
pub fn update_history_file<F>( &self, history_id: &str, update: F, ) -> Result<HistoryUpdate>
Apply update to a history file, with the whole read-modify-write held under
an exclusive lock.
Writing atomically stops two instances producing a corrupt file, but not a
lost one: both read [x, y], one writes [a, x, y] and the other
[b, x, y], and whichever lands second wins outright. Opening two datasets at
once is ordinary — a launcher, a file manager, two terminals — so the read and
the write have to be one operation.
The lock is waited for, but only briefly. The critical section is reading and rewriting a fifty-line file, so even a dozen contending instances clear in a few milliseconds; a deadline well beyond that loses nothing in practice while still guaranteeing an interactive action is never held up by a peer that has wedged. Past the deadline the update is dropped — history is a convenience, and it is never worth delaying what the user actually asked for.
Giving up after a couple of quick attempts is not enough: with several opens landing together, some are then dropped, which is the very loss this exists to prevent.
Source§impl CacheManager
impl CacheManager
Sourcepub fn load_recents(&self) -> Vec<PathBuf>
pub fn load_recents(&self) -> Vec<PathBuf>
Recently opened dataset paths, most recent first.
This is the only thing datui remembers about your data between runs. It is a convenience, not a record: deleting it loses nothing but ordering.
Sourcepub fn load_recents_with_visits(
&self,
) -> (Vec<PathBuf>, HashMap<PathBuf, Visits>)
pub fn load_recents_with_visits( &self, ) -> (Vec<PathBuf>, HashMap<PathBuf, Visits>)
Recents, most recent first, and how often and how lately each was opened, by its path as recorded: one read of the list.
Sourcepub fn load_folds(&self) -> HashMap<String, bool>
pub fn load_folds(&self) -> HashMap<String, bool>
Which home-screen sections the user folded or opened, by title.
One line per section, title<TAB>1 for folded and title<TAB>0 for opened.
A section not listed takes its own default.
Sourcepub fn save_folds(&self, folds: &HashMap<String, bool>)
pub fn save_folds(&self, folds: &HashMap<String, bool>)
Remember the fold state. Failing to write it loses nothing but a preference.
Sourcepub fn terminal_mode(&self, terminal: &str) -> Option<ThemeMode>
pub fn terminal_mode(&self, terminal: &str) -> Option<ThemeMode>
The mode terminal last said its background was, for the first frame of the
next start under theme.mode = "auto". One line per terminal: key<TAB>dark.
Sourcepub fn remember_terminal_mode(&self, terminal: &str, mode: ThemeMode)
pub fn remember_terminal_mode(&self, terminal: &str, mode: ThemeMode)
Remember what terminal answered, when it differs from what is remembered.
Sourcepub fn forget_recent(&self, path: &Path)
pub fn forget_recent(&self, path: &Path)
Forget a single recently opened path.
A recents list you cannot edit is one people stop trusting: an experiment, a file that would not open, something private — all land there, and clearing the whole cache to remove one is too blunt.
Sourcepub fn forget_recents(&self, paths: &[PathBuf])
pub fn forget_recents(&self, paths: &[PathBuf])
Forget several recently opened paths at once: every recent under one place.
Sourcepub fn clear_recents(&self)
pub fn clear_recents(&self)
Forget every recently opened path, leaving other caches alone.
Sourcepub fn push_recent(&self, path: &Path) -> HistoryUpdate
pub fn push_recent(&self, path: &Path) -> HistoryUpdate
Record a path as most recently opened, de-duplicating and capping the list.
Failures are ignored: not being able to write a convenience list must never interfere with opening data. The return value distinguishes a write from a contended skip for callers and tests that care; the normal caller does not.
Sourcepub fn load_visits(&self) -> HashMap<PathBuf, Visits>
pub fn load_visits(&self) -> HashMap<PathBuf, Visits>
How often and how lately each recent was opened, by its path as recorded.
Source§impl CacheManager
impl CacheManager
Sourcepub fn dataset_shapes_kept(&self) -> usize
pub fn dataset_shapes_kept(&self) -> usize
How many dataset shapes are kept.
Sourcepub fn dataset_shape(
&self,
path: &str,
fingerprint: &str,
) -> Option<DatasetShape>
pub fn dataset_shape( &self, path: &str, fingerprint: &str, ) -> Option<DatasetShape>
What datui remembers about one dataset, if the fingerprint still matches.
Taking the fingerprint as an argument rather than returning the entry and letting the caller check is deliberate: an entry whose fingerprint has moved on describes a dataset that no longer exists, and there is no use for it that is not a mistake. A hit counts as use, so the datasets that never change, with the most to gain, are not the first to age out.
Sourcepub fn has_dataset_shape(&self, path: &str) -> bool
pub fn has_dataset_shape(&self, path: &str) -> bool
Whether a shape is kept for path at all, whatever it was taken against: one
stat, so a caller can tell whether listing the dataset could find it.
Sourcepub fn save_dataset_shape(&self, path: &str, shape: DatasetShape)
pub fn save_dataset_shape(&self, path: &str, shape: DatasetShape)
Remember one dataset’s shape, keeping the others while they fit the budget.
The footers counts of the dataset at path have read, by file.
Remember the footers a count of the dataset at path read, by file.
Sourcepub fn cloud_listing(&self, id: &str, fingerprint: &str) -> Option<CloudListing>
pub fn cloud_listing(&self, id: &str, fingerprint: &str) -> Option<CloudListing>
The last listing of cloud source id, if it was taken at fingerprint.
Sourcepub fn load_cloud_listings(&self) -> HashMap<String, CloudListing>
pub fn load_cloud_listings(&self) -> HashMap<String, CloudListing>
Every source’s last listing, by source ID.
Sourcepub fn save_cloud_listing(&self, id: &str, listing: CloudListing)
pub fn save_cloud_listing(&self, id: &str, listing: CloudListing)
Record one source’s listing, keeping the others.
Source IDs hidden from the home screen with Delete.
Sourcepub fn hide_cloud_source(&self, id: &str)
pub fn hide_cloud_source(&self, id: &str)
Hide a source from the home screen until the cache is cleared.
Whether Delete on its heading hid the Example datasets that come with datui.
Only the bundled catalog: a user’s own examples.toml still shows.
Sourcepub fn hide_examples(&self)
pub fn hide_examples(&self)
Hide the bundled Example datasets from the home screen until the cache is cleared.
Sourcepub fn load_remembered_places(&self) -> Vec<PathBuf>
pub fn load_remembered_places(&self) -> Vec<PathBuf>
The directories Ctrl+D kept here before 0.4.0, which keeps them in
catalog.toml, in the order they were added.
Sourcepub fn clear_remembered_places(&self)
pub fn clear_remembered_places(&self)
Drop the list Self::load_remembered_places reads, once it is moved.
Sourcepub fn save_remembered_places(&self, places: &[PathBuf]) -> Result<()>
pub fn save_remembered_places(&self, places: &[PathBuf]) -> Result<()>
Write places where Ctrl+D kept them before 0.4.0, for the migration’s tests.
Source§impl CacheManager
impl CacheManager
Sourcepub fn load_dataset_facts(&self) -> HashMap<PathBuf, DatasetFacts>
pub fn load_dataset_facts(&self) -> HashMap<PathBuf, DatasetFacts>
Everything datui knows about datasets it has measured before, without counting any of it as use. Unreadable records are absent: this is a cache, and failing to read it must never be worse than not having it.
Sourcepub fn dataset_facts(&self, path: &Path) -> Option<DatasetFacts>
pub fn dataset_facts(&self, path: &Path) -> Option<DatasetFacts>
What datui knows about one dataset, counted as use.
Sourcepub fn touch_dataset_facts<'a>(&self, paths: impl IntoIterator<Item = &'a Path>)
pub fn touch_dataset_facts<'a>(&self, paths: impl IntoIterator<Item = &'a Path>)
Count these datasets’ records as used: shown on the home screen, say. The least recently used go first once the records pass their budget.
Sourcepub fn record_dataset_facts(&self, facts: &[(PathBuf, DatasetFacts)])
pub fn record_dataset_facts(&self, facts: &[(PathBuf, DatasetFacts)])
Record newly measured datasets, one file each. A path that is not UTF-8 is not recorded.
Trait Implementations§
Source§impl Clone for CacheManager
impl Clone for CacheManager
Auto Trait Implementations§
impl Freeze for CacheManager
impl RefUnwindSafe for CacheManager
impl Send for CacheManager
impl Sync for CacheManager
impl Unpin for CacheManager
impl UnsafeUnpin for CacheManager
impl UnwindSafe for CacheManager
Blanket Implementations§
impl<T> Allocation for T
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
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>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
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)
fn as_any(&self) -> &(dyn Any + 'static)
&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)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&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> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
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 moreSource§impl<T> Key for Twhere
T: Clone,
impl<T> Key for Twhere
T: Clone,
Source§impl<D> OwoColorize for D
impl<D> OwoColorize for D
Source§fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
Source§fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
Source§fn black(&self) -> FgColorDisplay<'_, Black, Self>
fn black(&self) -> FgColorDisplay<'_, Black, Self>
Source§fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
Source§fn red(&self) -> FgColorDisplay<'_, Red, Self>
fn red(&self) -> FgColorDisplay<'_, Red, Self>
Source§fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
Source§fn green(&self) -> FgColorDisplay<'_, Green, Self>
fn green(&self) -> FgColorDisplay<'_, Green, Self>
Source§fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
Source§fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
Source§fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
Source§fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
Source§fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
Source§fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
Source§fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
Source§fn white(&self) -> FgColorDisplay<'_, White, Self>
fn white(&self) -> FgColorDisplay<'_, White, Self>
Source§fn on_white(&self) -> BgColorDisplay<'_, White, Self>
fn on_white(&self) -> BgColorDisplay<'_, White, Self>
Source§fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
Source§fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
Source§fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
Source§fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
Source§fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
Source§fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
Source§fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
Source§fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
Source§fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
Source§fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
Source§fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
Source§fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
Source§fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
Source§fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
Source§fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
Source§fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
Source§fn bold(&self) -> BoldDisplay<'_, Self>
fn bold(&self) -> BoldDisplay<'_, Self>
Source§fn dimmed(&self) -> DimDisplay<'_, Self>
fn dimmed(&self) -> DimDisplay<'_, Self>
Source§fn italic(&self) -> ItalicDisplay<'_, Self>
fn italic(&self) -> ItalicDisplay<'_, Self>
Source§fn underline(&self) -> UnderlineDisplay<'_, Self>
fn underline(&self) -> UnderlineDisplay<'_, Self>
Source§fn blink(&self) -> BlinkDisplay<'_, Self>
fn blink(&self) -> BlinkDisplay<'_, Self>
Source§fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
Source§fn reversed(&self) -> ReversedDisplay<'_, Self>
fn reversed(&self) -> ReversedDisplay<'_, Self>
Source§fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
Source§fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::fg or
a color-specific method, such as OwoColorize::green, Read moreSource§fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::bg or
a color-specific method, such as OwoColorize::on_yellow, Read more