libai 0.3.0

AI 开发用到的一些基础数据结构
Documentation
pub mod dynamic;
pub mod json;
pub mod msgpack;

use anyhow::{Result, anyhow};
pub fn skip_white(buf: &[u8]) -> Result<usize> {
    let mut pos = 0usize;
    while pos < buf.len() && (buf[pos] == b' ' || buf[pos] == b'\r' || buf[pos] == b'\t' || buf[pos] == b'\n') {
        pos += 1;
    }
    if pos < buf.len() {
        Ok(pos)
    } else {
        Err(anyhow!("no more data"))
    }
}

pub struct ZOnce {
    first: Option<&'static str>,
    other: &'static str,
}

impl ZOnce {
    pub fn new(first: &'static str, other: &'static str) -> Self {
        Self { first: Some(first), other }
    }
    pub fn take(&mut self) -> &'static str {
        self.first.take().unwrap_or(self.other)
    }
}

#[macro_export]
macro_rules! assert_ok {
    ( $x: expr, $ok: expr) => {
        if $x {
            return Ok($ok);
        }
    };
}

#[macro_export]
macro_rules! assert_err {
    ( $x: expr, $err: expr) => {
        if $x {
            return Err($err);
        }
    };
}

#[macro_export]
macro_rules! dmap {
    ($($k:expr => $v:expr), *) => {{
        let mut map = std::collections::BTreeMap::new();
        $( let _ = map.insert(smol_str::SmolStr::from($k), Dynamic::from($v)); )*
        Dynamic::from_map(map)
    }};
}

#[macro_export]
macro_rules! dvec {
    ($($value:expr),*) => {{
        let mut vec = Dynamic::vec();
        $(
            let _ = vec.push(Dynamic::from($value));
        )*
        vec
    }};
}