Geoffrey-rs/geoffrey_db/src/query/player_query.rs

102 lines
3.2 KiB
Rust

use crate::error::Result;
use crate::query::QueryBuilder;
use geoffrey_models::models::player::{Player, UserID};
impl QueryBuilder<Player> {
pub fn with_name_regex(self, exp: &str) -> Result<Self> {
let filter = regex::Regex::new(exp)?;
Ok(
self.add_query_clause(Box::new(move |_: u64, player: &Player| {
filter.is_match(&player.name)
})),
)
}
pub fn with_name(self, name: &str) -> Self {
let name = name.to_lowercase();
self.add_query_clause(Box::new(move |_: u64, player: &Player| {
player.name.to_lowercase() == name
}))
}
pub fn with_user_id(self, user_id: UserID) -> Self {
self.add_query_clause(Box::new(move |_: u64, player: &Player| {
player.has_user_id(&user_id)
}))
}
}
#[cfg(test)]
mod test {
use crate::query::QueryBuilder;
use crate::test::{cleanup, DB, LOCK};
use geoffrey_models::models::player::{Player, UserID};
fn setup_db() -> (Player, Player, Player) {
let player1 = DB
.insert(Player::new(
"ZeroHD",
UserID::DiscordUUID { discord_uuid: 0 },
))
.unwrap();
let player2 = DB
.insert(Player::new(
"Vakbezel",
UserID::MinecraftUUID {
mc_uuid: "0000".to_string(),
},
))
.unwrap();
let player3 = DB
.insert(Player::new(
"Etzelia",
UserID::DiscordUUID { discord_uuid: 5 },
))
.unwrap();
(player1, player2, player3)
}
#[test]
fn test_with_name() {
let _lock = LOCK.lock().unwrap();
cleanup();
let (player1, player2, player3) = setup_db();
let query: QueryBuilder<Player> = QueryBuilder::new();
let query = query.with_name("ZeroHD");
assert_eq!(DB.run_query(query).unwrap()[0].name, player1.name);
let query: QueryBuilder<Player> = QueryBuilder::new();
let query = query.with_name("Vakbezel");
assert_eq!(DB.run_query(query).unwrap()[0].name, player2.name);
let query: QueryBuilder<Player> = QueryBuilder::new();
let query = query.with_name("Etzelia");
assert_eq!(DB.run_query(query).unwrap()[0].name, player3.name);
}
#[test]
fn test_with_user_id() {
let _lock = LOCK.lock().unwrap();
cleanup();
let (player1, player2, player3) = setup_db();
let query: QueryBuilder<Player> = QueryBuilder::new();
let query = query.with_user_id(UserID::DiscordUUID { discord_uuid: 0 });
assert_eq!(DB.run_query(query).unwrap()[0].name, player1.name);
let query: QueryBuilder<Player> = QueryBuilder::new();
let query = query.with_user_id(UserID::MinecraftUUID {
mc_uuid: "0000".to_string(),
});
let query = query.with_name("Vakbezel");
assert_eq!(DB.run_query(query).unwrap()[0].name, player2.name);
let query: QueryBuilder<Player> = QueryBuilder::new();
let query = query.with_user_id(UserID::DiscordUUID { discord_uuid: 5 });
assert_eq!(DB.run_query(query).unwrap()[0].name, player3.name);
}
}