use std::sync::{Arc, RwLock as StdRwLock, Mutex as StdMutex};
use serenity::{futures::{lock::Mutex, FutureExt}, model::id::GuildId, prelude::RwLock};
pub trait SettingsProvider {
fn default_prefixes(&self) -> Vec<String>;
fn prefixes(&self, guild_id: GuildId) -> Option<Vec<String>>;
fn auto_register(&self) -> bool;
fn auto_delete(&self) -> bool;
fn auto_register_guilds(&self) -> Vec<GuildId>;
}
pub struct Settings {
pub prefixes: Vec<&'static str>,
pub auto_register: bool,
pub auto_delete: bool,
pub slash_command_guilds: Vec<GuildId>,
}
impl SettingsProvider for Settings {
fn default_prefixes(&self) -> Vec<String> {
self.prefixes.iter().map(|s| s.to_string()).collect()
}
fn prefixes(&self, _guild_id: GuildId) -> Option<Vec<String>> {
Some(self.default_prefixes())
}
fn auto_register(&self) -> bool {
self.auto_register
}
fn auto_delete(&self) -> bool {
self.auto_delete
}
fn auto_register_guilds(&self) -> Vec<GuildId> {
self.slash_command_guilds.clone()
}
}
impl<T: SettingsProvider + Send> SettingsProvider for Arc<Mutex<T>> {
fn default_prefixes(&self) -> Vec<String> {
async { self.lock().await.default_prefixes() }
.now_or_never()
.unwrap()
}
fn prefixes(&self, guild_id: GuildId) -> Option<Vec<String>> {
async { self.lock().await.prefixes(guild_id) }
.now_or_never()
.unwrap()
}
fn auto_register(&self) -> bool {
async { self.lock().await.auto_register() }
.now_or_never()
.unwrap()
}
fn auto_delete(&self) -> bool {
async { self.lock().await.auto_delete() }
.now_or_never()
.unwrap()
}
fn auto_register_guilds(&self) -> Vec<GuildId> {
async { self.lock().await.auto_register_guilds() }
.now_or_never()
.unwrap()
}
}
impl<T: SettingsProvider + Send> SettingsProvider for Arc<StdMutex<T>> {
fn default_prefixes(&self) -> Vec<String> {
T::default_prefixes(&self.lock().unwrap())
}
fn prefixes(&self, guild_id: GuildId) -> Option<Vec<String>> {
T::prefixes(&self.lock().unwrap(), guild_id)
}
fn auto_register(&self) -> bool {
T::auto_register(&self.lock().unwrap())
}
fn auto_delete(&self) -> bool {
T::auto_delete(&self.lock().unwrap())
}
fn auto_register_guilds(&self) -> Vec<GuildId> {
T::auto_register_guilds(&self.lock().unwrap())
}
}
impl<T: SettingsProvider> SettingsProvider for Arc<T> {
fn default_prefixes(&self) -> Vec<String> {
T::default_prefixes(&self)
}
fn prefixes(&self, guild_id: GuildId) -> Option<Vec<String>> {
T::prefixes(&self, guild_id)
}
fn auto_register(&self) -> bool {
T::auto_register(&self)
}
fn auto_delete(&self) -> bool {
T::auto_delete(&self)
}
fn auto_register_guilds(&self) -> Vec<GuildId> {
T::auto_register_guilds(&self)
}
}
impl<T: SettingsProvider> SettingsProvider for RwLock<T> {
fn default_prefixes(&self) -> Vec<String> {
async { self.read().await.default_prefixes() }
.now_or_never()
.unwrap()
}
fn prefixes(&self, guild_id: GuildId) -> Option<Vec<String>> {
async { self.read().await.prefixes(guild_id) }
.now_or_never()
.unwrap()
}
fn auto_register(&self) -> bool {
async { self.read().await.auto_register() }
.now_or_never()
.unwrap()
}
fn auto_delete(&self) -> bool {
async { self.read().await.auto_delete() }
.now_or_never()
.unwrap()
}
fn auto_register_guilds(&self) -> Vec<GuildId> {
async { self.read().await.auto_register_guilds() }
.now_or_never()
.unwrap()
}
}
impl<T: SettingsProvider> SettingsProvider for StdRwLock<T> {
fn default_prefixes(&self) -> Vec<String> {
T::default_prefixes(&self.read().unwrap())
}
fn prefixes(&self, guild_id: GuildId) -> Option<Vec<String>> {
T::prefixes(&self.read().unwrap(), guild_id)
}
fn auto_register(&self) -> bool {
T::auto_register(&self.read().unwrap())
}
fn auto_delete(&self) -> bool {
T::auto_delete(&self.read().unwrap())
}
fn auto_register_guilds(&self) -> Vec<GuildId> {
T::auto_register_guilds(&self.read().unwrap())
}
}