teamspeak-query-lib/src/response.rs

103 lines
No EOL
2.9 KiB
Rust

pub mod channel;
pub mod client;
use std::fmt::{Debug, Display, Formatter};
use crate::parameter::*;
pub enum Response {
Ok,
Data(ParameterList),
DataList(Vec<ParameterList>),
}
pub struct ResponseError {
pub id: i32,
pub msg: String,
}
impl TryFrom<String> for Response {
type Error = ResponseError;
fn try_from(response_str: String) -> Result<Self, ResponseError> {
let mut response_str = response_str.trim_end_matches("\n\r");
if response_str.starts_with("error ") {
response_str = response_str.trim_start_matches("error ");
let response_params = parameter_parse(response_str);
Err(ResponseError::create_error(&response_params))
}
else {
let mut parameter_lists: Vec<ParameterList> = Vec::new();
for response_entry in response_str.split('|') {
let response_params = parameter_parse(response_entry);
parameter_lists.push(response_params);
}
Ok(Response::DataList(parameter_lists))
}
}
}
impl Debug for Response {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
Response::Ok => {
write!(f, "Ok")
}
Response::Data(params) => {
write!(f, "Data:")?;
write!(f, "{:?};", params)?;
Ok(())
}
Response::DataList(params_list) => {
write!(f, "DataList:")?;
for params in params_list {
write!(f, "{:?};", params)?;
}
Ok(())
}
}
}
}
impl Display for Response {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
Response::Ok => {
write!(f, "Ok")
}
Response::Data(params) => {
for param in params {
write!(f, "{};", param)?;
}
Ok(())
}
Response::DataList(params_list) => {
for params in params_list {
write!(f, "[")?;
for param in params {
write!(f, "{};", param)?;
}
write!(f, "]")?;
}
Ok(())
}
}
}
}
impl ResponseError {
pub fn is_error_okay(&self) -> bool {
self.id == 0
}
fn create_error(params: &Vec<Parameter>) -> ResponseError {
ResponseError {
id: parameter_find(params, "id")
.unwrap_or_else(|| Parameter::new(String::from("id"), String::from("-1")))
.to_i32(-1),
msg: parameter_find(params, "msg")
.unwrap_or_else(|| Parameter::new(String::from("msg"), String::from("Unknown error.")))
.value,
}
}
}