parent
9e7586021c
commit
dbd0e068f6
@ -0,0 +1,94 @@
|
||||
//! Database manipulation stuffs
|
||||
use super::*;
|
||||
use std::{
|
||||
path::{
|
||||
PathBuf,
|
||||
},
|
||||
error,
|
||||
fmt,
|
||||
io,
|
||||
marker::Unpin,
|
||||
};
|
||||
/// An error in database operations
|
||||
#[derive(Debug)]
|
||||
#[non_exhaustive]
|
||||
pub enum Error {
|
||||
ExpectedLine(Option<String>),
|
||||
IO(io::Error),
|
||||
Unknown,
|
||||
}
|
||||
impl error::Error for Error
|
||||
{
|
||||
fn source(&self) -> Option<&(dyn error::Error + 'static)> {
|
||||
match &self {
|
||||
Self::IO(io) => Some(io),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
impl fmt::Display for Error
|
||||
{
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result
|
||||
{
|
||||
match self {
|
||||
Self::IO(_)=> write!(f, "i/o"),
|
||||
Self::ExpectedLine(None) => write!(f, "expected a line that was not present in the file"),
|
||||
Self::ExpectedLine(Some(msg)) => write!(f, "{}", msg),
|
||||
_ => write!(f, "unknown"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// Contains Videl information for a database directory
|
||||
#[derive(Debug, Clone, PartialEq, Ord, Eq, PartialOrd, Hash)]
|
||||
pub struct Database
|
||||
{
|
||||
pub path: PathBuf,
|
||||
}
|
||||
|
||||
impl Database
|
||||
{
|
||||
/// Save this database to a stream
|
||||
pub async fn save<T: AsyncWrite + Unpin + ?Sized>(&self, stream: &mut T) -> Result<usize, Error>
|
||||
{
|
||||
let bytes = resolve::path_bytes(&self.path);
|
||||
stream.write_all(&bytes[..]).await?;
|
||||
stream.write_u8(b'\n').await?;
|
||||
Ok(bytes.len() + 1)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// Load database info from this file
|
||||
pub async fn load<T: AsyncBufRead + Unpin + ?Sized>(stream: &mut T) -> Result<Database, Error>
|
||||
{
|
||||
let mut buffer = String::new();
|
||||
macro_rules! line {
|
||||
($message:literal $($tt:tt)*) => {
|
||||
{
|
||||
buffer.clear();
|
||||
let read = stream.read_line(&mut buffer).await?;
|
||||
if read == 0 {
|
||||
return Err(Error::ExpectedLine(Some(format!($message $($tt)*))));
|
||||
}
|
||||
&buffer[..]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let location_encoded = line!("expected the location line");
|
||||
|
||||
Ok(Database{
|
||||
path: PathBuf::from(location_encoded),
|
||||
})
|
||||
}
|
||||
|
||||
impl From<io::Error> for Error
|
||||
{
|
||||
#[inline] fn from(from: io::Error) -> Self
|
||||
{
|
||||
Self::IO(from)
|
||||
}
|
||||
}
|
Loading…
Reference in new issue