mirror of
https://github.com/tribufu/rust-gamedig
synced 2026-05-18 09:35:50 +00:00
Better, faster and stronger errors.
This commit is contained in:
parent
b988b51cff
commit
304b8340d2
7 changed files with 75 additions and 69 deletions
36
src/utils.rs
36
src/utils.rs
|
|
@ -4,12 +4,24 @@ use crate::{GDResult, GDError};
|
|||
|
||||
fn resolve_dns(address: &str) -> GDResult<String> {
|
||||
let resolver = Resolver::new(ResolverConfig::default(), ResolverOpts::default())
|
||||
.map_err(|e| GDError::DnsResolve(e.to_string()))?;
|
||||
.map_err(|e| GDError::DnsResolve(e.to_string().as_str()))?;
|
||||
|
||||
let response = resolver.lookup_ip(address)
|
||||
.map_err(|e| GDError::DnsResolve(e.to_string()))?;
|
||||
.map_err(|e| GDError::DnsResolve(e.to_string().as_str()))?;
|
||||
|
||||
Ok(response.iter().next().ok_or(GDError::DnsResolve("Couldn't resolve the DNS address.".to_string()))?.to_string())
|
||||
Ok(response.iter().next().ok_or(GDError::DnsResolve("Couldn't resolve the DNS address."))?.to_string())
|
||||
}
|
||||
|
||||
pub fn error_by_expected_size(expected: usize, size: usize) -> GDResult<()> {
|
||||
if size < expected {
|
||||
Err(GDError::PacketUnderflow("Unexpectedly short packet."))
|
||||
}
|
||||
else if size > expected {
|
||||
Err(GDError::PacketOverflow("Unexpectedly long packet."))
|
||||
}
|
||||
else {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
pub fn complete_address(address: &str, port: u16) -> GDResult<String> {
|
||||
|
|
@ -25,7 +37,7 @@ pub mod buffer {
|
|||
|
||||
pub fn get_u8(buf: &[u8], pos: &mut usize) -> GDResult<u8> {
|
||||
if buf.len() <= *pos {
|
||||
return Err(GDError::PacketUnderflow("Unexpectedly short packet.".to_string()));
|
||||
return Err(GDError::PacketUnderflow("Unexpectedly short packet."));
|
||||
}
|
||||
|
||||
let value = buf[*pos];
|
||||
|
|
@ -35,7 +47,7 @@ pub mod buffer {
|
|||
|
||||
pub fn get_u16_le(buf: &[u8], pos: &mut usize) -> GDResult<u16> {
|
||||
if buf.len() <= *pos + 1 {
|
||||
return Err(GDError::PacketUnderflow("Unexpectedly short packet.".to_string()));
|
||||
return Err(GDError::PacketUnderflow("Unexpectedly short packet."));
|
||||
}
|
||||
|
||||
let value = u16::from_le_bytes([buf[*pos], buf[*pos + 1]]);
|
||||
|
|
@ -45,7 +57,7 @@ pub mod buffer {
|
|||
|
||||
pub fn get_u16_be(buf: &[u8], pos: &mut usize) -> GDResult<u16> {
|
||||
if buf.len() <= *pos + 1 {
|
||||
return Err(GDError::PacketUnderflow("Unexpectedly short packet.".to_string()));
|
||||
return Err(GDError::PacketUnderflow("Unexpectedly short packet."));
|
||||
}
|
||||
|
||||
let value = u16::from_be_bytes([buf[*pos], buf[*pos + 1]]);
|
||||
|
|
@ -55,7 +67,7 @@ pub mod buffer {
|
|||
|
||||
pub fn get_u32_le(buf: &[u8], pos: &mut usize) -> GDResult<u32> {
|
||||
if buf.len() <= *pos + 3 {
|
||||
return Err(GDError::PacketUnderflow("Unexpectedly short packet.".to_string()));
|
||||
return Err(GDError::PacketUnderflow("Unexpectedly short packet."));
|
||||
}
|
||||
|
||||
let value = u32::from_le_bytes([buf[*pos], buf[*pos + 1], buf[*pos + 2], buf[*pos + 3]]);
|
||||
|
|
@ -65,7 +77,7 @@ pub mod buffer {
|
|||
|
||||
pub fn get_f32_le(buf: &[u8], pos: &mut usize) -> GDResult<f32> {
|
||||
if buf.len() <= *pos + 3 {
|
||||
return Err(GDError::PacketUnderflow("Unexpectedly short packet.".to_string()));
|
||||
return Err(GDError::PacketUnderflow("Unexpectedly short packet."));
|
||||
}
|
||||
|
||||
let value = f32::from_le_bytes([buf[*pos], buf[*pos + 1], buf[*pos + 2], buf[*pos + 3]]);
|
||||
|
|
@ -75,7 +87,7 @@ pub mod buffer {
|
|||
|
||||
pub fn get_u64_le(buf: &[u8], pos: &mut usize) -> GDResult<u64> {
|
||||
if buf.len() <= *pos + 7 {
|
||||
return Err(GDError::PacketUnderflow("Unexpectedly short packet.".to_string()));
|
||||
return Err(GDError::PacketUnderflow("Unexpectedly short packet."));
|
||||
}
|
||||
|
||||
let value = u64::from_le_bytes([buf[*pos], buf[*pos + 1], buf[*pos + 2], buf[*pos + 3], buf[*pos + 4], buf[*pos + 5], buf[*pos + 6], buf[*pos + 7]]);
|
||||
|
|
@ -86,9 +98,9 @@ pub mod buffer {
|
|||
pub fn get_string_utf8_le(buf: &[u8], pos: &mut usize) -> GDResult<String> {
|
||||
let sub_buf = &buf[*pos..];
|
||||
let first_null_position = sub_buf.iter().position(|&x| x == 0)
|
||||
.ok_or(GDError::PacketBad("Unexpectedly formatted packet.".to_string()))?;
|
||||
.ok_or(GDError::PacketBad("Unexpectedly formatted packet."))?;
|
||||
let value = std::str::from_utf8(&sub_buf[..first_null_position])
|
||||
.map_err(|_| GDError::PacketBad("Badly formatted string.".to_string()))?.to_string();
|
||||
.map_err(|_| GDError::PacketBad("Badly formatted string."))?.to_string();
|
||||
|
||||
*pos += value.len() + 1;
|
||||
Ok(value)
|
||||
|
|
@ -100,7 +112,7 @@ pub mod buffer {
|
|||
.into_iter().map(|a| u16::from_be_bytes([a[0], a[1]])).collect();
|
||||
|
||||
let value = String::from_utf16(&paired_buf)
|
||||
.map_err(|_| GDError::PacketBad("Badly formatted string.".to_string()))?.to_string();
|
||||
.map_err(|_| GDError::PacketBad("Badly formatted string."))?.to_string();
|
||||
|
||||
*pos += value.len() + 1;
|
||||
Ok(value)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue