Implemented more trait functions for Filesystem
This commit is contained in:
parent
179b8ad100
commit
c9eb30f4e7
2 changed files with 84 additions and 17 deletions
|
@ -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!()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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!()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue