use crate::errors::Result;
use tonic::transport::Channel;
mod api {
tonic::include_proto!("agones.dev.sdk.alpha");
}
use api::sdk_client::SdkClient;
#[derive(Clone)]
pub struct Alpha {
client: SdkClient<Channel>,
}
impl Alpha {
pub(crate) fn new(ch: Channel) -> Self {
Self {
client: SdkClient::new(ch),
}
}
#[inline]
pub async fn get_player_capacity(&mut self) -> Result<i64> {
Ok(self
.client
.get_player_capacity(api::Empty {})
.await
.map(|c| c.into_inner().count)?)
}
#[inline]
pub async fn set_player_capacity(&mut self, count: i64) -> Result<()> {
Ok(self
.client
.set_player_capacity(api::Count { count })
.await
.map(|_| ())?)
}
#[inline]
pub async fn player_connect(&mut self, id: impl Into<String>) -> Result<bool> {
Ok(self
.client
.player_connect(api::PlayerId {
player_id: id.into(),
})
.await
.map(|b| b.into_inner().bool)?)
}
#[inline]
pub async fn player_disconnect(&mut self, id: impl Into<String>) -> Result<bool> {
Ok(self
.client
.player_disconnect(api::PlayerId {
player_id: id.into(),
})
.await
.map(|b| b.into_inner().bool)?)
}
#[inline]
pub async fn get_player_count(&mut self) -> Result<i64> {
Ok(self
.client
.get_player_count(api::Empty {})
.await
.map(|c| c.into_inner().count)?)
}
#[inline]
pub async fn is_player_connected(&mut self, id: impl Into<String>) -> Result<bool> {
Ok(self
.client
.is_player_connected(api::PlayerId {
player_id: id.into(),
})
.await
.map(|b| b.into_inner().bool)?)
}
#[inline]
pub async fn get_connected_players(&mut self) -> Result<Vec<String>> {
Ok(self
.client
.get_connected_players(api::Empty {})
.await
.map(|pl| pl.into_inner().list)?)
}
}
#[cfg(test)]
mod tests {
use tokio;
struct MockAlpha {
capacity: i64,
player_count: i64,
player_connected: Option<String>,
player_disconnected: Option<String>,
}
impl MockAlpha {
fn new() -> Self {
Self {
capacity: 0,
player_count: 0,
player_connected: None,
player_disconnected: None,
}
}
async fn get_player_capacity(&mut self) -> i64 {
self.capacity
}
async fn set_player_capacity(&mut self, count: i64) {
self.capacity = count;
}
async fn player_connect(&mut self, id: impl Into<String>) -> bool {
let id = id.into();
self.player_connected = Some(id.clone());
self.player_count += 1;
true
}
async fn player_disconnect(&mut self, id: impl Into<String>) -> bool {
let id = id.into();
self.player_disconnected = Some(id.clone());
if self.player_count > 0 {
self.player_count -= 1;
}
true
}
async fn get_player_count(&mut self) -> i64 {
self.player_count
}
async fn is_player_connected(&mut self, id: impl Into<String>) -> bool {
match &self.player_connected {
Some(connected) => id.into() == *connected,
None => false,
}
}
async fn get_connected_players(&mut self) -> Vec<String> {
match &self.player_connected {
Some(id) => vec![id.clone()],
None => vec![],
}
}
}
#[tokio::test]
async fn test_alpha_player_flow() {
let mut alpha = MockAlpha::new();
alpha.set_player_capacity(15).await;
assert_eq!(alpha.capacity, 15);
let capacity = alpha.get_player_capacity().await;
assert_eq!(capacity, 15);
let player_id = "one";
let ok = alpha.player_connect(player_id).await;
assert!(ok);
assert_eq!(alpha.player_connected.as_deref(), Some(player_id));
let count = alpha.get_player_count().await;
assert_eq!(count, 1);
let ok = alpha.player_disconnect(player_id).await;
assert!(ok);
assert_eq!(alpha.player_disconnected.as_deref(), Some(player_id));
let ok = alpha.player_connect(player_id).await;
assert!(ok);
let count = alpha.get_player_count().await;
assert_eq!(count, 1);
let ok = alpha.is_player_connected(player_id).await;
assert!(ok, "Player should be connected");
let ok = alpha.is_player_connected("false").await;
assert!(!ok, "Player should not be connected");
let list = alpha.get_connected_players().await;
assert_eq!(list, vec![player_id]);
}
}