51 lines
1.2 KiB
Rust
51 lines
1.2 KiB
Rust
use crate::mailbox::Mailbox;
|
|
|
|
pub struct User {
|
|
pub name: String,
|
|
pub creds: Credentials,
|
|
}
|
|
|
|
pub enum State {
|
|
NotAuthenticated,
|
|
Authenticated(User),
|
|
Selected(User, Mailbox),
|
|
Logout
|
|
}
|
|
pub enum Error {
|
|
ForbiddenTransition,
|
|
}
|
|
|
|
// See RFC3501 section 3.
|
|
// https://datatracker.ietf.org/doc/html/rfc3501#page-13
|
|
impl State {
|
|
pub fn authenticate(&mut self, user: User) -> Result<(), Error> {
|
|
self = match state {
|
|
State::NotAuthenticated => State::Authenticated(user),
|
|
_ => return Err(ForbiddenTransition),
|
|
};
|
|
Ok(())
|
|
}
|
|
|
|
pub fn logout(&mut self) -> Self {
|
|
self = State::Logout;
|
|
Ok(())
|
|
}
|
|
|
|
pub fn select(&mut self, mailbox: Mailbox) -> Result<(), Error> {
|
|
self = match state {
|
|
State::Authenticated(user) => State::Selected(user, mailbox),
|
|
_ => return Err(ForbiddenTransition),
|
|
};
|
|
Ok(())
|
|
}
|
|
|
|
pub fn unselect(state: State) -> Result<(), Error> {
|
|
self = match state {
|
|
State::Selected(user, _) => State::Authenticated(user),
|
|
_ => return Err(ForbiddenTransition),
|
|
};
|
|
Ok(())
|
|
}
|
|
}
|
|
|