quakeworld 0.2.3

A collection of quakeworld related libraries.
Documentation

use serde::Serialize;

#[cfg(feature = "ascii_strings")]
use crate::utils::ascii_converter::AsciiConverter;
use crate::protocol::types::StringByte;


#[derive(Clone, Debug, Serialize, Default)]
pub struct Userinfo {
#[cfg(feature = "ascii_strings")]
    ascii_converter: AsciiConverter,
    pub values: Vec<(StringByte, StringByte)>,
}

impl Userinfo {
    pub fn new() -> Userinfo {
        Userinfo{ ..Default::default()}
    }
#[cfg(feature = "ascii_strings")]
    pub fn new_with_ascii_converter(ascii_converter: AsciiConverter) -> Userinfo {
        Userinfo{
            ascii_converter,
            ..Default::default()
        }
    }

#[cfg(feature = "ascii_strings")]
    pub fn update_key_value(&mut self, key: &StringByte, value: &StringByte) {
        for i in 0..self.values.len() {
            let (k, _) = &self.values[i];
            if k.string == key.string {
                self.values[i] = (key.clone(), value.clone());
                return
            }
        }
        self.values.push((key.clone(), value.clone()));
    }

#[cfg(not(feature = "ascii_strings"))]
    pub fn update_key_value(&mut self, key: &StringByte, value: &StringByte) {
        for i in 0..self.values.len() {
            let (k, _) = &self.values[i];
            if *k == *key {
                self.values[i] = (key.clone(), value.clone());
                return
            }
        }
        self.values.push((key.clone(), value.clone()));
    }


#[cfg(feature = "ascii_strings")]
    pub fn update(&mut self, userinfo: &StringByte) {
        let mut start = true;
        let mut key_vec: Vec<u8> = vec![];
        let mut v:Vec<u8> = vec![];
        let mut key = true;
        for i in 0..userinfo.bytes.len() {
            if userinfo.bytes[i] == 92 {
                if start {
                    start = false;
                    continue;
                } else {
                    if key {
                        key_vec = v.clone();
                    } else {
                        let sb_k = StringByte{
                                    string: self.ascii_converter.convert(key_vec.clone()),
                                    bytes: key_vec.clone()};
                        let sb_v = StringByte{
                                    string: self.ascii_converter.convert(v.clone()),
                                    bytes: v.clone()};
                        self.values.push((sb_k ,sb_v))
                    }
                    key = !key;
                    v.clear();
                    continue;
                }
            }
            v.push(userinfo.bytes[i]);
        }
    }

#[cfg(not(feature = "ascii_strings"))]
    pub fn update(&mut self, userinfo: &StringByte) {
        let mut start = true;
        let mut key_vec: Vec<u8> = vec![];
        let mut v:Vec<u8> = vec![];
        let mut key = true;
        for i in 0..userinfo.bytes.len() {
            if userinfo.bytes[i] == 92 {
                if start {
                    start = false;
                    continue;
                } else {
                    if key {
                        key_vec = v.clone();
                    } else {
                        self.values.push((
                                    StringByte{ bytes: key_vec.clone()},
                                    StringByte{ bytes: v.clone()},
                                    ))
                    }
                    key = !key;
                    v.clear();
                    continue;
                }
            }
            v.push(userinfo.bytes[i]);
        }
    }

#[cfg(not(feature = "ascii_strings"))]
    pub fn update_from_string(&mut self, key: impl Into<Vec<u8>>, value: impl Into<Vec<u8>>) {
        let key = key.into();
        let value = value.into();
        let sb_k = StringByte::new(key);
        let sb_v = StringByte::new(value);
        self.update_key_value(&sb_k, &sb_v);
    }

#[cfg(feature = "ascii_strings")]
    pub fn update_from_string(&mut self, key: impl Into<Vec<u8>>, value: impl Into<Vec<u8>>) {
        let key = key.into();
        let value = value.into();
        let sb_k = StringByte::new(key, &self.ascii_converter);
        let sb_v = StringByte::new(value, &self.ascii_converter);
        self.update_key_value(&sb_k, &sb_v);
    }

    pub fn as_bytes(&mut self) -> Vec<u8> {
        let mut rb: Vec<u8> = Vec::new();
        for i in 0..self.values.len() {
            let (k, v) = &self.values[i];
#[cfg(feature = "ascii_strings")]
            {
                rb.push(b'\\');
                rb.extend(k.bytes.clone());
                rb.push(b'\\');
                rb.extend(v.bytes.clone());
            }
#[cfg(not(feature = "ascii_strings"))]
            {
                rb.push(b'\\');
                rb.extend(k.bytes.clone());
                rb.push(b'\\');
                rb.extend(v.bytes.clone());
            }
        }
        rb
    }
}