use std::fmt::{self, Display};
#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
pub enum Strategy {
#[default]
UserInChat,
Chat,
GlobalUser,
UserInThread,
ChatThread,
UserInChatAndConnection,
ChatAndConnection,
GlobalUserAndConnection,
UserInThreadAndConnection,
ChatThreadAndConnection,
}
impl Display for Strategy {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.as_str())
}
}
impl Strategy {
#[inline]
#[must_use]
pub const fn as_str(&self) -> &'static str {
match self {
Strategy::UserInChat => "user_in_chat",
Strategy::Chat => "chat",
Strategy::GlobalUser => "global_user",
Strategy::UserInThread => "user_in_thread",
Strategy::ChatThread => "chat_thread",
Strategy::UserInChatAndConnection => "user_in_chat_and_connection",
Strategy::ChatAndConnection => "chat_and_connection",
Strategy::GlobalUserAndConnection => "global_user_and_connection",
Strategy::UserInThreadAndConnection => "user_in_thread_and_connection",
Strategy::ChatThreadAndConnection => "chat_thread_and_connection",
}
}
}
pub struct IdPair {
pub chat_id: i64,
pub user_id: i64,
pub message_thread_id: Option<i64>,
pub business_connection_id: Option<String>,
}
impl Strategy {
#[inline]
#[must_use]
pub fn apply(
&self,
chat_id: i64,
user_id: i64,
message_thread_id: Option<i64>,
business_connection_id: Option<String>,
) -> IdPair {
match self {
Strategy::UserInChat => IdPair {
chat_id,
user_id,
message_thread_id: None,
business_connection_id: None,
},
Strategy::UserInChatAndConnection => IdPair {
chat_id,
user_id,
message_thread_id: None,
business_connection_id,
},
Strategy::Chat => IdPair {
chat_id,
user_id: chat_id,
message_thread_id: None,
business_connection_id: None,
},
Strategy::ChatAndConnection => IdPair {
chat_id,
user_id: chat_id,
message_thread_id: None,
business_connection_id,
},
Strategy::GlobalUser => IdPair {
chat_id: user_id,
user_id,
message_thread_id: None,
business_connection_id: None,
},
Strategy::GlobalUserAndConnection => IdPair {
chat_id: user_id,
user_id,
message_thread_id: None,
business_connection_id,
},
Strategy::UserInThread => IdPair {
chat_id,
user_id,
message_thread_id,
business_connection_id: None,
},
Strategy::UserInThreadAndConnection => IdPair {
chat_id,
user_id,
message_thread_id,
business_connection_id,
},
Strategy::ChatThread => IdPair {
chat_id,
user_id: chat_id,
message_thread_id,
business_connection_id: None,
},
Strategy::ChatThreadAndConnection => IdPair {
chat_id,
user_id: chat_id,
message_thread_id,
business_connection_id,
},
}
}
}