55 lines
1.1 KiB
Rust
55 lines
1.1 KiB
Rust
//! File utilities.
|
|
|
|
use crate::err::*;
|
|
use std::fs;
|
|
use std::io::{SeekFrom, prelude::*};
|
|
|
|
/// Confirms that the path `p` is a folder.
|
|
pub fn validate_folder_path(p: &str) -> ResultS<()>
|
|
{
|
|
let at = fs::metadata(p)?;
|
|
if at.is_dir() {
|
|
Ok(())
|
|
} else {
|
|
Err(err_msg("not a directory"))
|
|
}
|
|
}
|
|
|
|
impl<T> Drop for SeekBackToStart<T>
|
|
where T: Seek
|
|
{
|
|
fn drop(&mut self) {if self.fl {let _ = self.seek(SeekFrom::Start(0));}}
|
|
}
|
|
|
|
impl<T> std::ops::Deref for SeekBackToStart<T>
|
|
where T: Seek
|
|
{
|
|
type Target = T;
|
|
|
|
fn deref(&self) -> &Self::Target {&self.sc}
|
|
}
|
|
|
|
impl<T> std::ops::DerefMut for SeekBackToStart<T>
|
|
where T: Seek
|
|
{
|
|
fn deref_mut(&mut self) -> &mut Self::Target {&mut self.sc}
|
|
}
|
|
|
|
impl<T> SeekBackToStart<T>
|
|
where T: Seek
|
|
{
|
|
pub fn new(sc: T) -> Self {SeekBackToStart{sc, fl: true}}
|
|
|
|
pub fn set_seek(&mut self, fl: bool) {self.fl = fl;}
|
|
pub fn get_seek(&self) -> bool {self.fl}
|
|
}
|
|
|
|
/// Seeks back to the starting position of the inner object when losing scope,
|
|
/// unless a flag is set.
|
|
pub struct SeekBackToStart<T: Seek> {
|
|
sc: T,
|
|
fl: bool,
|
|
}
|
|
|
|
// EOF
|