aboutsummaryrefslogtreecommitdiff
path: root/src/imap/command/selected.rs
diff options
context:
space:
mode:
authorQuentin Dufour <quentin@deuxfleurs.fr>2022-06-20 18:09:20 +0200
committerQuentin Dufour <quentin@deuxfleurs.fr>2022-06-20 18:09:20 +0200
commitca4c2e7505f28acad688705d45cc5c5dca1799c3 (patch)
tree6820ad27dfdaa5e51e2f296832d75a4a9a6678ae /src/imap/command/selected.rs
parent5dd5ae8bcd6f88703bc483d7f8d5882fefad4e7e (diff)
downloadaerogramme-ca4c2e7505f28acad688705d45cc5c5dca1799c3.tar.gz
aerogramme-ca4c2e7505f28acad688705d45cc5c5dca1799c3.zip
WIP refactor
Diffstat (limited to 'src/imap/command/selected.rs')
-rw-r--r--src/imap/command/selected.rs43
1 files changed, 39 insertions, 4 deletions
diff --git a/src/imap/command/selected.rs b/src/imap/command/selected.rs
index b320ec2..61e9c1a 100644
--- a/src/imap/command/selected.rs
+++ b/src/imap/command/selected.rs
@@ -1,10 +1,45 @@
+
+use anyhow::{Result, Error};
+use boitalettres::proto::Response;
+use imap_codec::types::command::CommandBody;
+use imap_codec::types::core::Tag;
+use imap_codec::types::fetch_attributes::MacroOrFetchAttributes;
+use imap_codec::types::response::{Response as ImapRes, Status};
+use imap_codec::types::sequence::SequenceSet;
+
+use crate::imap::command::authenticated;
+use crate::imap::session::InnerContext;
+use crate::imap::flow::User;
+use crate::mailbox::Mailbox;
+
+pub async fn dispatch<'a>(inner: &'a InnerContext<'a>, user: &'a User, mailbox: &'a Mailbox) -> Result<Response> {
+ let ctx = StateContext { inner, user, mailbox, tag: &inner.req.tag };
+
+ match ctx.inner.req.body {
+ CommandBody::Fetch { sequence_set, attributes, uid, } => ctx.fetch(sequence_set, attributes, uid).await,
+ _ => authenticated::dispatch(inner, user).await,
+ }
+}
+
+// --- PRIVATE ---
+
+struct StateContext<'a> {
+ inner: InnerContext<'a>,
+ user: &'a User,
+ mailbox: &'a Mailbox,
+ tag: &'a Tag,
+}
+
+
+impl<'a> StateContext<'a> {
pub async fn fetch(
&self,
sequence_set: SequenceSet,
attributes: MacroOrFetchAttributes,
uid: bool,
- ) -> Result<Response> {
- Ok(vec![ImapRes::Status(
- Status::bad(Some(self.tag.clone()), None, "Not implemented").map_err(Error::msg)?,
- )])
+ ) -> Result<Response> {
+ Ok(vec![
+ ImapRes::Status(Status::bad(Some(self.tag.clone()), None, "Not implemented").map_err(Error::msg)?),
+ ])
}
+}