mod loop_impl;
mod responder;
#[cfg(test)]
mod tests;
use super::loop_helpers::{MentionsFetcher, PostSender, ReplyGenerator, SafetyChecker};
use std::sync::Arc;
pub struct MentionsLoop {
pub(crate) fetcher: Arc<dyn MentionsFetcher>,
pub(crate) generator: Arc<dyn ReplyGenerator>,
pub(crate) safety: Arc<dyn SafetyChecker>,
pub(crate) poster: Arc<dyn PostSender>,
pub(crate) dry_run: bool,
}
#[derive(Debug)]
pub enum MentionResult {
Replied {
tweet_id: String,
author: String,
reply_text: String,
},
Skipped { tweet_id: String, reason: String },
Failed { tweet_id: String, error: String },
}
impl MentionsLoop {
pub fn new(
fetcher: Arc<dyn MentionsFetcher>,
generator: Arc<dyn ReplyGenerator>,
safety: Arc<dyn SafetyChecker>,
poster: Arc<dyn PostSender>,
dry_run: bool,
) -> Self {
Self {
fetcher,
generator,
safety,
poster,
dry_run,
}
}
}
pub(crate) fn update_max_id(current: &mut Option<String>, candidate: &str) {
let is_greater = match current {
Some(ref existing) => {
if candidate.len() != existing.len() {
candidate.len() > existing.len()
} else {
candidate > existing.as_str()
}
}
None => true,
};
if is_greater {
*current = Some(candidate.to_string());
}
}
pub(crate) fn truncate(s: &str, max_len: usize) -> String {
if s.len() <= max_len {
s.to_string()
} else {
format!("{}...", &s[..max_len])
}
}