use std::future::Future;
use std::pin::Pin;
use std::sync::Arc;
use regex::Regex;
use rust_tg_bot_raw::types::update::Update;
use super::base::{Handler, HandlerCallback, HandlerResult, MatchResult};
pub struct PreCheckoutQueryHandler {
callback: HandlerCallback,
pattern: Option<Regex>,
block: bool,
}
impl PreCheckoutQueryHandler {
pub fn new(callback: HandlerCallback, pattern: Option<Regex>, block: bool) -> Self {
Self {
callback,
pattern,
block,
}
}
}
impl Handler for PreCheckoutQueryHandler {
fn check_update(&self, update: &Update) -> Option<MatchResult> {
let pcq = update.pre_checkout_query()?;
if let Some(ref re) = self.pattern {
let payload = &pcq.invoice_payload;
if re.is_match(payload) {
Some(MatchResult::Empty)
} else {
None
}
} else {
Some(MatchResult::Empty)
}
}
fn handle_update(
&self,
update: Arc<Update>,
match_result: MatchResult,
) -> Pin<Box<dyn Future<Output = HandlerResult> + Send>> {
(self.callback)(update, match_result)
}
fn block(&self) -> bool {
self.block
}
}