use crate::binary::{BOOL_SIZE, DATA_TYPE_SIZE, MAX_DATA_LENGTH_SIZE, NUMBER_LENGTH_SIZE};
use crate::builder::BuildResult;
use crate::vec::VecExt;
use crate::yason::{Yason, YasonBuf};
use crate::{DataType, Number};
use decimal_rs::MAX_BINARY_SIZE;
#[derive(Debug)]
pub struct Scalar {}
impl Scalar {
#[inline]
pub fn string<T: AsRef<str>>(s: T) -> BuildResult<YasonBuf> {
let mut bytes = Vec::new();
Scalar::string_with_vec(s, &mut bytes)?;
Ok(unsafe { YasonBuf::new_unchecked(bytes) })
}
#[inline]
pub fn string_with_vec<T: AsRef<str>>(s: T, bytes: &mut Vec<u8>) -> BuildResult<&Yason> {
let init_len = bytes.len();
let s = s.as_ref();
let size = DATA_TYPE_SIZE + MAX_DATA_LENGTH_SIZE + s.len();
bytes.try_reserve(size)?;
bytes.push_data_type(DataType::String);
bytes.push_string(s)?;
Ok(unsafe { Yason::new_unchecked(&bytes[init_len..]) })
}
#[inline]
pub fn number<Num: AsRef<Number>>(value: Num) -> BuildResult<YasonBuf> {
let mut bytes = Vec::new();
Scalar::number_with_vec(value, &mut bytes)?;
Ok(unsafe { YasonBuf::new_unchecked(bytes) })
}
#[inline]
pub fn number_with_vec<Num: AsRef<Number>>(value: Num, bytes: &mut Vec<u8>) -> BuildResult<&Yason> {
let init_len = bytes.len();
let size = DATA_TYPE_SIZE + NUMBER_LENGTH_SIZE + MAX_BINARY_SIZE;
bytes.try_reserve(size)?;
bytes.push_data_type(DataType::Number);
bytes.push_number(value.as_ref());
Ok(unsafe { Yason::new_unchecked(&bytes[init_len..]) })
}
#[inline]
pub fn bool(value: bool) -> BuildResult<YasonBuf> {
let mut bytes = Vec::new();
Scalar::bool_with_vec(value, &mut bytes)?;
Ok(unsafe { YasonBuf::new_unchecked(bytes) })
}
#[inline]
pub fn bool_with_vec(value: bool, bytes: &mut Vec<u8>) -> BuildResult<&Yason> {
let init_len = bytes.len();
let size = DATA_TYPE_SIZE + BOOL_SIZE;
bytes.try_reserve(size)?;
bytes.push_data_type(DataType::Bool);
bytes.push_u8(value as u8);
Ok(unsafe { Yason::new_unchecked(&bytes[init_len..]) })
}
#[inline]
pub fn null() -> BuildResult<YasonBuf> {
let mut bytes = Vec::new();
Scalar::null_with_vec(&mut bytes)?;
Ok(unsafe { YasonBuf::new_unchecked(bytes) })
}
#[inline]
pub fn null_with_vec(bytes: &mut Vec<u8>) -> BuildResult<&Yason> {
let init_len = bytes.len();
bytes.try_reserve(DATA_TYPE_SIZE)?;
bytes.push_data_type(DataType::Null);
Ok(unsafe { Yason::new_unchecked(&bytes[init_len..]) })
}
}