Move TimeoutSettings to be a type that can be used by multiple protocols

This commit is contained in:
CosminPerRam 2022-11-16 00:06:13 +02:00
parent f04c883269
commit 974e093e23
4 changed files with 54 additions and 49 deletions

View file

@ -6,3 +6,5 @@
/// Reference: [Server Query](https://developer.valvesoftware.com/wiki/Server_queries)
pub mod valve;
/// General types that are used by all protocols.
pub mod types;

50
src/protocols/types.rs Normal file
View file

@ -0,0 +1,50 @@
use std::time::Duration;
use crate::{GDError, GDResult};
/// Timeout settings for socket operations
pub struct TimeoutSettings {
read: Option<Duration>,
write: Option<Duration>
}
impl TimeoutSettings {
/// Construct new settings, passing None will block indefinitely. Passing zero Duration throws GDError::[InvalidInput](GDError::InvalidInput).
pub fn new(read: Option<Duration>, write: Option<Duration>) -> GDResult<Self> {
if let Some(read_duration) = read {
if read_duration == Duration::new(0, 0) {
return Err(GDError::InvalidInput("Can't pass duration 0 to timeout settings".to_owned()))
}
}
if let Some(write_duration) = write {
if write_duration == Duration::new(0, 0) {
return Err(GDError::InvalidInput("Can't pass duration 0 to timeout settings".to_owned()))
}
}
Ok(Self {
read,
write
})
}
/// Get the read timeout.
pub fn get_read(&self) -> Option<Duration> {
self.read
}
/// Get the write timeout.
pub fn get_write(&self) -> Option<Duration> {
self.write
}
}
impl Default for TimeoutSettings {
/// Default values are 4 seconds for both read and write.
fn default() -> Self {
Self {
read: Some(Duration::from_secs(4)),
write: Some(Duration::from_secs(4))
}
}
}

View file

@ -1,7 +1,8 @@
use std::net::UdpSocket;
use bzip2_rs::decoder::Decoder;
use crate::{GDError, GDResult};
use crate::protocols::valve::{App, ModData, SteamID, TimeoutSettings};
use crate::protocols::types::TimeoutSettings;
use crate::protocols::valve::{App, ModData, SteamID};
use crate::protocols::valve::types::{Environment, ExtraData, GatheringSettings, Request, Response, Server, ServerInfo, ServerPlayer, ServerRule, TheShip};
use crate::utils::{buffer, complete_address, u8_lower_upper};

View file

@ -219,54 +219,6 @@ impl Default for GatheringSettings {
}
}
/// Timeout settings for socket operations
pub struct TimeoutSettings {
read: Option<Duration>,
write: Option<Duration>
}
impl TimeoutSettings {
/// Construct new settings, passing None will block indefinitely. Passing zero Duration throws GDError::[InvalidInput](GDError::InvalidInput).
pub fn new(read: Option<Duration>, write: Option<Duration>) -> GDResult<Self> {
if let Some(read_duration) = read {
if read_duration == Duration::new(0, 0) {
return Err(GDError::InvalidInput("Can't pass duration 0 to timeout settings".to_owned()))
}
}
if let Some(write_duration) = write {
if write_duration == Duration::new(0, 0) {
return Err(GDError::InvalidInput("Can't pass duration 0 to timeout settings".to_owned()))
}
}
Ok(Self {
read,
write
})
}
/// Get the read timeout.
pub fn get_read(&self) -> Option<Duration> {
self.read
}
/// Get the write timeout.
pub fn get_write(&self) -> Option<Duration> {
self.write
}
}
impl Default for TimeoutSettings {
/// Default values are 4 seconds for both read and write.
fn default() -> Self {
Self {
read: Some(Duration::from_secs(4)),
write: Some(Duration::from_secs(4))
}
}
}
/// Generic response types that are used by many games, they are the protocol ones, but without the
/// unnecessary bits (example: the **The Ship**-only fields)
pub mod game {