Implemented more trait functions for Filesystem

This commit is contained in:
Nathan Fisher 2023-05-29 01:18:36 -04:00
parent 179b8ad100
commit c9eb30f4e7
2 changed files with 84 additions and 17 deletions

View file

@ -1,11 +1,20 @@
use super::*; use super::*;
use std::{fs::{self, File}, io::{self, Write}, os::unix::fs::DirBuilderExt, path::PathBuf}; use std::{
fs::{self, File},
io::{self, Write},
os::unix::fs::DirBuilderExt,
path::PathBuf,
process::id,
};
pub trait MultiDomain: MailStore { pub trait MultiDomain: MailStore {
type Error; type Error;
fn domains(&self) -> Result<Vec<String>, <Self as filesystem::MultiDomain>::Error>; fn domains(&self) -> Result<Vec<String>, <Self as filesystem::MultiDomain>::Error>;
fn add_domain(&mut self, domain: &str) -> Result<(), <Self as filesystem::MultiDomain>::Error>; fn add_domain(&mut self, domain: &str) -> Result<(), <Self as filesystem::MultiDomain>::Error>;
fn remove_domain(&mut self, domain: &str) -> Result<(), <Self as filesystem::MultiDomain>::Error>; fn remove_domain(
&mut self,
domain: &str,
) -> Result<(), <Self as filesystem::MultiDomain>::Error>;
} }
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
@ -73,7 +82,12 @@ impl MailStore for Filesystem {
}) })
} }
fn add_message(&mut self, user: &str, folder: &str, message: Message) -> Result<(), Self::Error> { fn add_message(
&mut self,
user: &str,
folder: &str,
message: Message,
) -> Result<(), Self::Error> {
let Some((user, host)) = user.rsplit_once('@') else { let Some((user, host)) = user.rsplit_once('@') else {
return Err(io::Error::new(io::ErrorKind::Other, "Invalid username")); return Err(io::Error::new(io::ErrorKind::Other, "Invalid username"));
}; };
@ -86,15 +100,45 @@ impl MailStore for Filesystem {
write!(fd, "{message}") write!(fd, "{message}")
} }
fn delete_message(&mut self, user: &str, folder: &str, key: &str) -> Result<(), Self::Error> { fn delete_message(&mut self, user: &str, folder: &str, id: &str) -> Result<(), Self::Error> {
todo!() let Some((user, host)) = user.rsplit_once('@') else {
return Err(io::Error::new(io::ErrorKind::Other, "Invalid username"));
};
let mut path = self.path.clone();
path.push(host);
path.push(user);
path.push(folder);
path.push(id);
if path.exists() {
fs::remove_file(&path)?;
}
Ok(())
} }
fn move_message(&mut self, user: &str, title: &str, folder: &str) { fn move_message(
todo!() &mut self,
user: &str,
id: &str,
folder1: &str,
folder2: &str,
) -> Result<(), io::Error> {
let Some((user, host)) = user.rsplit_once('@') else {
return Err(io::Error::new(io::ErrorKind::Other, "Invalid username"));
};
let mut infile = self.path.clone();
infile.push(host);
infile.push(user);
let mut outfile = infile.clone();
infile.push(folder1);
infile.push(id);
outfile.push(folder2);
outfile.push(id);
fs::copy(&infile, &outfile)?;
fs::remove_file(infile)?;
Ok(())
} }
fn add_user(&mut self, user: &str) -> Result<(), ParseMailboxError> { fn add_user(&mut self, user: &str) -> Result<(), Self::Error> {
todo!() todo!()
} }

View file

@ -1,6 +1,6 @@
#![allow(unused_variables)] #![allow(unused_variables)]
use crate::prelude::{Host, Mailbox, Mailuser, Message, ParseMailboxError}; use crate::prelude::{Host, Mailbox, Mailuser, Message, ParseMailboxError};
use std::{collections::HashMap, str::FromStr, convert::Infallible}; use std::{collections::HashMap, convert::Infallible, io, str::FromStr};
#[cfg(feature = "serde")] #[cfg(feature = "serde")]
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -22,13 +22,24 @@ pub trait MailStore {
/// returns the message /// returns the message
fn get_message(&self, user: &str, folder: &str, title: &str) -> Option<Message>; fn get_message(&self, user: &str, folder: &str, title: &str) -> Option<Message>;
/// Move a message to a new folder /// Move a message to a new folder
fn move_message(&mut self, user: &str, id: &str, folder: &str); fn move_message(
&mut self,
user: &str,
id: &str,
folder1: &str,
folder2: &str,
) -> Result<(), Self::Error>;
/// Deletes a message it it exists /// Deletes a message it it exists
fn delete_message(&mut self, user: &str, folder: &str, id: &str) -> Result<(), Self::Error>; fn delete_message(&mut self, user: &str, folder: &str, id: &str) -> Result<(), Self::Error>;
/// Adds a message /// Adds a message
fn add_message(&mut self, user: &str, folder: &str, message: Message) -> Result<(), Self::Error>; fn add_message(
&mut self,
user: &str,
folder: &str,
message: Message,
) -> Result<(), Self::Error>;
/// Adds a new mailuser to the given domain /// Adds a new mailuser to the given domain
fn add_user(&mut self, user: &str) -> Result<(), ParseMailboxError>; fn add_user(&mut self, user: &str) -> Result<(), Self::Error>;
/// Removes the given user if the account exists /// Removes the given user if the account exists
fn remove_user(&mut self, user: &str) -> bool; fn remove_user(&mut self, user: &str) -> bool;
} }
@ -61,7 +72,7 @@ pub struct MultiDomain {
} }
impl MailStore for Domain { impl MailStore for Domain {
type Error = Infallible; type Error = io::Error;
fn users(&self) -> Vec<Mailuser> { fn users(&self) -> Vec<Mailuser> {
self.users self.users
@ -101,15 +112,22 @@ impl MailStore for Domain {
.cloned() .cloned()
} }
fn move_message(&mut self, user: &str, id: &str, folder: &str) { fn move_message(
&mut self,
user: &str,
id: &str,
folder1: &str,
folder2: &str,
) -> Result<(), Self::Error> {
todo!() todo!()
} }
fn add_user(&mut self, user: &str) -> Result<(), ParseMailboxError> { fn add_user(&mut self, user: &str) -> Result<(), Self::Error> {
if self.users.contains_key(user) { if self.users.contains_key(user) {
return Ok(()); return Ok(());
} }
let mbox = Mailbox::from_str(&format!("{user}@{}", self.host.to_string()))?; let mbox = Mailbox::from_str(&format!("{user}@{}", self.host.to_string()))
.map_err(|e| io::Error::new(io::ErrorKind::Other, format!("{e}")))?;
let folders = HashMap::new(); let folders = HashMap::new();
let acct = Account { let acct = Account {
user: mbox, user: mbox,
@ -123,7 +141,12 @@ impl MailStore for Domain {
self.users.remove(user).is_some() self.users.remove(user).is_some()
} }
fn add_message(&mut self, user: &str, folder: &str, message: Message) -> Result<(), Self::Error> { fn add_message(
&mut self,
user: &str,
folder: &str,
message: Message,
) -> Result<(), Self::Error> {
todo!() todo!()
} }