jt_util 0.1.1

jt808 jt1078等基础库实现
Documentation
use std::{fmt, usize};

use bytes::{BufMut, Bytes, BytesMut};

use serde::{de::Visitor, Deserialize, Serialize};
#[derive(Clone, Debug, Default)]
pub struct BytesBCD {
    bytes: Bytes,
    fixed_len: usize,
}
impl BytesBCD {
    pub fn new() -> Self {
        BytesBCD {
            bytes: Bytes::new(),
            fixed_len: 0,
        }
    }
    fn trim0(&mut self) -> usize {
        if self.bytes_len() > 0 {
            match self.bytes.iter().position(|b| *b > 0) {
                Some(i) => {
                    if i > 0 {
                        let _ = self.bytes.split_to(i);
                    }
                }
                None => self.bytes.clear(),
            }
        }
        self.bytes_len()
    }
    pub fn bytes_len(&self) -> usize {
        self.bytes.len()
    }
    pub fn set_bytes_len(&mut self, fixed_len: usize) {
        let mut len = self.bytes.len();
        self.fixed_len = fixed_len;
        if fixed_len > 0 && len != fixed_len {
            len = self.trim0();
            if len > fixed_len {
                self.bytes.split_at(fixed_len);
            } else if len < fixed_len {
                let mut buf = BytesMut::with_capacity(fixed_len);

                while buf.len() + len < fixed_len {
                    buf.put_u8(0u8);
                }
                buf.put(self.bytes.clone());

                self.bytes = buf.freeze();
            }
        }
    }
    pub fn get_bytes(&self) -> Bytes {
        self.bytes.clone()
    }
    pub fn set_bytes(&mut self, bytes: Bytes) {
        self.bytes = bytes;
    }
    pub fn get_val(&self) -> String {
        hex::encode(self.bytes.as_ref())
    }
    pub fn set_val(&mut self, val: &str, mut strlen: usize) {
        let ret_hex;
        if strlen % 2 > 0 {
            strlen = strlen + 1;
        }
        if val.len() != strlen {
            ret_hex = hex::decode(Self::fixsimlen(val.to_string(), strlen));
        } else {
            ret_hex = hex::decode(val);
        }
        match ret_hex {
            Ok(b) => {
                self.bytes = Bytes::from(b);
                self.set_bytes_len(strlen / 2);
            }
            Err(_) => {
                self.bytes.clear();
            }
        }
    }
    pub fn fixsimlen(sim: String, len: usize) -> String {
        let mut sim = sim;
        if sim.len() > len {
            sim.truncate(len);
        } else {
            while sim.len() < len {
                sim.insert_str(0, "0")
            }
        }
        sim
    }

    pub fn get_string(bytes: Bytes) -> String {
        hex::encode(bytes.as_ref())
    }
}

impl fmt::Display for BytesBCD {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "{}", self.get_val())
    }
}

struct BytesBCDVisitor;

impl<'de> Visitor<'de> for BytesBCDVisitor {
    type Value = BytesBCD;

    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
        formatter.write_str("expecting")
    }
    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
    where
        E: serde::de::Error,
    {
        let mut b = BytesBCD::new();
        b.set_val(v, v.len());
        Ok(b)
    }
}
impl<'de> Deserialize<'de> for BytesBCD {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: serde::Deserializer<'de>,
    {
        let s = deserializer.deserialize_str(BytesBCDVisitor {})?;
        Ok(s)
    }
}
impl Serialize for BytesBCD {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        self.get_val().serialize(serializer)
    }
}