melib/jmap: implement mailbox rename

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
pull/458/head
Manos Pitsidianakis 3 months ago
parent 8481294147
commit f7ec6d6bc5
No known key found for this signature in database
GPG Key ID: 7729C7707F7E09D0

@ -680,13 +680,54 @@ impl MailBackend for JmapType {
fn rename_mailbox(
&mut self,
_mailbox_hash: MailboxHash,
_new_path: String,
mailbox_hash: MailboxHash,
new_path: String,
) -> ResultFuture<Mailbox> {
Err(
Error::new("Renaming mailbox is currently unimplemented for the JMAP backend.")
.set_kind(ErrorKind::NotImplemented),
)
let store = self.store.clone();
let mailbox_id: Id<mailbox::MailboxObject> = {
let mailboxes_lck = store.mailboxes.read().unwrap();
let Some(id) = mailboxes_lck.get(&mailbox_hash).map(|m| m.id.clone()) else {
return Err(
Error::new(format!("Mailbox with hash {} not found", mailbox_hash))
.set_kind(ErrorKind::NotFound),
);
};
id
};
let connection = self.connection.clone();
Ok(Box::pin(async move {
let mailbox_state = store.mailbox_state.lock().await.clone();
let mut conn = connection.lock().await;
let mail_account_id = conn.session_guard().await?.mail_account_id();
let mailbox_set_call = mailbox::MailboxSet::new(
Set::<mailbox::MailboxObject>::new(Some(mailbox_state))
.account_id(mail_account_id)
.update(Some({
indexmap! {
mailbox_id.clone().into() => serde_json::json!{indexmap! {
"name" => new_path.clone()
}}
}
})),
);
let mut req = Request::new(conn.request_no.clone());
let _prev_seq = req.add_call(&mailbox_set_call).await;
let new_mailboxes = protocol::get_mailboxes(&mut conn, Some(req)).await?;
let new_mailbox: Mailbox = new_mailboxes
.iter()
.find_map(|(_, m)| {
if m.path() == new_path {
Some(BackendMailbox::clone(m) as Mailbox)
} else {
None
}
})
.unwrap();
*store.mailboxes.write().unwrap() = new_mailboxes;
Ok(new_mailbox)
}))
}
fn create_mailbox(

@ -128,9 +128,9 @@ pub async fn get_mailboxes(
req.add_call(&mailbox_get).await;
let res_text = conn.send_request(serde_json::to_string(&req)?).await?;
let mut v: MethodResponse = deserialize_from_str(&res_text)?;
let v: MethodResponse = deserialize_from_str(&res_text)?;
conn.store.online_status.update_timestamp(None).await;
let m = GetResponse::<MailboxObject>::try_from(v.method_responses.remove(0))?;
let m = GetResponse::<MailboxObject>::try_from(*v.method_responses.last().unwrap())?;
let GetResponse::<MailboxObject> {
list,
account_id,

Loading…
Cancel
Save