From 018156fe4114a6054177d75b21a7dd60f117b44d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20DOUIN?= Date: Thu, 12 Feb 2026 12:54:19 +0100 Subject: [PATCH] feat: return id of added message The feature is only implemented for the message save and template save commands. Other commands like message send copy move don't return the added id. Refs: #627 --- src/email/message/command/save.rs | 39 ++++++++++++++++++---- src/email/message/template/command/save.rs | 39 ++++++++++++++++++---- 2 files changed, 65 insertions(+), 13 deletions(-) diff --git a/src/email/message/command/save.rs b/src/email/message/command/save.rs index 3c601540..6509bc49 100644 --- a/src/email/message/command/save.rs +++ b/src/email/message/command/save.rs @@ -1,14 +1,17 @@ +use std::{ + fmt, + io::{self, BufRead, IsTerminal}, + sync::Arc, +}; + use clap::Parser; use color_eyre::Result; -use email::{backend::feature::BackendFeatureSource, config::Config}; +use email::{backend::feature::BackendFeatureSource, config::Config, envelope::SingleId}; use pimalaya_tui::{ himalaya::backend::BackendBuilder, terminal::{cli::printer::Printer, config::TomlConfig as _}, }; -use std::{ - io::{self, BufRead, IsTerminal}, - sync::Arc, -}; +use serde::{ser::SerializeStruct, Serialize, Serializer}; use tracing::info; use crate::{ @@ -69,8 +72,30 @@ impl MessageSaveCommand { .join("\r\n") }; - backend.add_message(folder, msg.as_bytes()).await?; + let id = backend.add_message(folder, msg.as_bytes()).await?; - printer.out(format!("Message successfully saved to {folder}!\n")) + printer.out(MessageAdded { folder, id }) + } +} + +struct MessageAdded<'a> { + folder: &'a String, + id: SingleId, +} + +impl fmt::Display for MessageAdded<'_> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let id = self.id.as_str(); + let folder = self.folder; + writeln!(f, "Message {id} successfully saved to {folder}") + } +} + +impl Serialize for MessageAdded<'_> { + fn serialize(&self, serializer: S) -> Result { + let mut state = serializer.serialize_struct("MessageAdded", 2)?; + state.serialize_field("folder", self.folder)?; + state.serialize_field("id", self.id.as_str())?; + state.end() } } diff --git a/src/email/message/template/command/save.rs b/src/email/message/template/command/save.rs index 40f575a3..1570b99c 100644 --- a/src/email/message/template/command/save.rs +++ b/src/email/message/template/command/save.rs @@ -1,15 +1,18 @@ +use std::{ + fmt, + io::{self, BufRead, IsTerminal}, + sync::Arc, +}; + use clap::Parser; use color_eyre::Result; -use email::{backend::feature::BackendFeatureSource, config::Config}; +use email::{backend::feature::BackendFeatureSource, config::Config, envelope::SingleId}; use mml::MmlCompilerBuilder; use pimalaya_tui::{ himalaya::backend::BackendBuilder, terminal::{cli::printer::Printer, config::TomlConfig as _}, }; -use std::{ - io::{self, BufRead, IsTerminal}, - sync::Arc, -}; +use serde::{ser::SerializeStruct, Serialize, Serializer}; use tracing::info; use crate::{ @@ -85,6 +88,30 @@ impl TemplateSaveCommand { backend.add_message(folder, &msg).await?; - printer.out(format!("Template successfully saved to {folder}!\n")) + let id = backend.add_message(folder, &msg).await?; + + printer.out(TemplateAdded { folder, id }) + } +} + +struct TemplateAdded<'a> { + folder: &'a String, + id: SingleId, +} + +impl fmt::Display for TemplateAdded<'_> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let id = self.id.as_str(); + let folder = self.folder; + writeln!(f, "Template {id} successfully saved to {folder}") + } +} + +impl Serialize for TemplateAdded<'_> { + fn serialize(&self, serializer: S) -> Result { + let mut state = serializer.serialize_struct("TemplateAdded", 2)?; + state.serialize_field("folder", self.folder)?; + state.serialize_field("id", self.id.as_str())?; + state.end() } }