gbserver/src/services/keywords/create_draft.rs

64 lines
2.3 KiB
Rust
Raw Normal View History

2025-08-02 00:07:54 -03:00
use crate::services::email::{fetch_latest_sent_to, SaveDraftRequest};
use crate::services::email::{save_email_draft};
use crate::services::state::AppState;
2025-07-20 00:03:37 -03:00
use rhai::Dynamic;
use rhai::Engine;
pub fn create_draft_keyword(state: &AppState, engine: &mut Engine) {
let state_clone = state.clone();
2025-07-20 00:03:37 -03:00
engine
.register_custom_syntax(
2025-07-30 23:26:06 -03:00
&["CREATE_DRAFT", "$expr$", ",", "$expr$", ",", "$expr$"],
2025-07-20 00:03:37 -03:00
true, // Statement
move |context, inputs| {
// Extract arguments
let to = context.eval_expression_tree(&inputs[0])?.to_string();
let subject = context.eval_expression_tree(&inputs[1])?.to_string();
let reply_text = context.eval_expression_tree(&inputs[2])?.to_string();
2025-07-20 00:03:37 -03:00
// Execute async operations using the same pattern as FIND
let fut = execute_create_draft(&state_clone, &to, &subject, &reply_text);
let result =
tokio::task::block_in_place(|| tokio::runtime::Handle::current().block_on(fut))
.map_err(|e| format!("Draft creation error: {}", e))?;
2025-07-20 00:03:37 -03:00
Ok(Dynamic::from(result))
2025-07-20 00:03:37 -03:00
},
)
.unwrap();
}
async fn execute_create_draft(
state: &AppState,
to: &str,
subject: &str,
reply_text: &str,
) -> Result<String, String> {
2025-08-02 00:07:54 -03:00
let get_result = fetch_latest_sent_to(&state.config.clone().unwrap().email, to).await;
let email_body = if let Ok(get_result_str) = get_result {
if !get_result_str.is_empty() {
2025-08-04 08:30:13 -03:00
let email_separator = "\n\n-------------------------------------------------\n\n"; // Horizontal rule style separator
reply_text.to_string() + email_separator + get_result_str.as_str()
} else {
2025-08-04 08:30:13 -03:00
// Fixed: Use reply_text when get_result_str is empty, not empty string
reply_text.to_string()
}
} else {
reply_text.to_string()
};
// Create and save draft
let draft_request = SaveDraftRequest {
to: to.to_string(),
subject: subject.to_string(),
cc: None,
text: email_body,
};
let save_result = match save_email_draft(&state.config.clone().unwrap().email, &draft_request).await {
Ok(_) => Ok("Draft saved successfully".to_string()),
Err(e) => Err(e.to_string()),
};
save_result
2025-08-04 08:30:13 -03:00
}