use serde_json::{Number, Value};
use super::DataType;
pub trait JsonSerializable: 'static {
fn into_json_value(self) -> Option<Value>;
}
pub trait ArrowNativeType:
std::fmt::Debug
+ Send
+ Sync
+ Copy
+ PartialOrd
+ std::str::FromStr
+ Default
+ JsonSerializable
{
#[inline]
fn from_usize(_: usize) -> Option<Self> {
None
}
#[inline]
fn to_usize(&self) -> Option<usize> {
None
}
#[inline]
fn to_isize(&self) -> Option<isize> {
None
}
#[inline]
fn from_i32(_: i32) -> Option<Self> {
None
}
#[inline]
fn from_i64(_: i64) -> Option<Self> {
None
}
}
pub trait ArrowPrimitiveType: 'static {
type Native: ArrowNativeType;
const DATA_TYPE: DataType;
fn get_byte_width() -> usize {
std::mem::size_of::<Self::Native>()
}
fn default_value() -> Self::Native {
Default::default()
}
}
impl JsonSerializable for bool {
fn into_json_value(self) -> Option<Value> {
Some(self.into())
}
}
impl JsonSerializable for i8 {
fn into_json_value(self) -> Option<Value> {
Some(self.into())
}
}
impl ArrowNativeType for i8 {
#[inline]
fn from_usize(v: usize) -> Option<Self> {
num::FromPrimitive::from_usize(v)
}
#[inline]
fn to_usize(&self) -> Option<usize> {
num::ToPrimitive::to_usize(self)
}
#[inline]
fn to_isize(&self) -> Option<isize> {
num::ToPrimitive::to_isize(self)
}
}
impl JsonSerializable for i16 {
fn into_json_value(self) -> Option<Value> {
Some(self.into())
}
}
impl ArrowNativeType for i16 {
#[inline]
fn from_usize(v: usize) -> Option<Self> {
num::FromPrimitive::from_usize(v)
}
#[inline]
fn to_usize(&self) -> Option<usize> {
num::ToPrimitive::to_usize(self)
}
#[inline]
fn to_isize(&self) -> Option<isize> {
num::ToPrimitive::to_isize(self)
}
}
impl JsonSerializable for i32 {
fn into_json_value(self) -> Option<Value> {
Some(self.into())
}
}
impl ArrowNativeType for i32 {
#[inline]
fn from_usize(v: usize) -> Option<Self> {
num::FromPrimitive::from_usize(v)
}
#[inline]
fn to_usize(&self) -> Option<usize> {
num::ToPrimitive::to_usize(self)
}
#[inline]
fn to_isize(&self) -> Option<isize> {
num::ToPrimitive::to_isize(self)
}
#[inline]
fn from_i32(val: i32) -> Option<Self> {
Some(val)
}
}
impl JsonSerializable for i64 {
fn into_json_value(self) -> Option<Value> {
Some(Value::Number(Number::from(self)))
}
}
impl ArrowNativeType for i64 {
#[inline]
fn from_usize(v: usize) -> Option<Self> {
num::FromPrimitive::from_usize(v)
}
#[inline]
fn to_usize(&self) -> Option<usize> {
num::ToPrimitive::to_usize(self)
}
#[inline]
fn to_isize(&self) -> Option<isize> {
num::ToPrimitive::to_isize(self)
}
#[inline]
fn from_i64(val: i64) -> Option<Self> {
Some(val)
}
}
impl JsonSerializable for u8 {
fn into_json_value(self) -> Option<Value> {
Some(self.into())
}
}
impl ArrowNativeType for u8 {
#[inline]
fn from_usize(v: usize) -> Option<Self> {
num::FromPrimitive::from_usize(v)
}
#[inline]
fn to_usize(&self) -> Option<usize> {
num::ToPrimitive::to_usize(self)
}
#[inline]
fn to_isize(&self) -> Option<isize> {
num::ToPrimitive::to_isize(self)
}
}
impl JsonSerializable for u16 {
fn into_json_value(self) -> Option<Value> {
Some(self.into())
}
}
impl ArrowNativeType for u16 {
#[inline]
fn from_usize(v: usize) -> Option<Self> {
num::FromPrimitive::from_usize(v)
}
#[inline]
fn to_usize(&self) -> Option<usize> {
num::ToPrimitive::to_usize(self)
}
#[inline]
fn to_isize(&self) -> Option<isize> {
num::ToPrimitive::to_isize(self)
}
}
impl JsonSerializable for u32 {
fn into_json_value(self) -> Option<Value> {
Some(self.into())
}
}
impl ArrowNativeType for u32 {
#[inline]
fn from_usize(v: usize) -> Option<Self> {
num::FromPrimitive::from_usize(v)
}
#[inline]
fn to_usize(&self) -> Option<usize> {
num::ToPrimitive::to_usize(self)
}
#[inline]
fn to_isize(&self) -> Option<isize> {
num::ToPrimitive::to_isize(self)
}
}
impl JsonSerializable for u64 {
fn into_json_value(self) -> Option<Value> {
Some(self.into())
}
}
impl ArrowNativeType for u64 {
#[inline]
fn from_usize(v: usize) -> Option<Self> {
num::FromPrimitive::from_usize(v)
}
#[inline]
fn to_usize(&self) -> Option<usize> {
num::ToPrimitive::to_usize(self)
}
#[inline]
fn to_isize(&self) -> Option<isize> {
num::ToPrimitive::to_isize(self)
}
}
impl JsonSerializable for f32 {
fn into_json_value(self) -> Option<Value> {
Number::from_f64(f64::round(self as f64 * 1000.0) / 1000.0).map(Value::Number)
}
}
impl JsonSerializable for f64 {
fn into_json_value(self) -> Option<Value> {
Number::from_f64(self).map(Value::Number)
}
}
impl ArrowNativeType for f32 {}
impl ArrowNativeType for f64 {}
pub trait ToByteSlice {
fn to_byte_slice(&self) -> &[u8];
}
impl<T: ArrowNativeType> ToByteSlice for [T] {
#[inline]
fn to_byte_slice(&self) -> &[u8] {
let raw_ptr = self.as_ptr() as *const T as *const u8;
unsafe {
std::slice::from_raw_parts(raw_ptr, self.len() * std::mem::size_of::<T>())
}
}
}
impl<T: ArrowNativeType> ToByteSlice for T {
#[inline]
fn to_byte_slice(&self) -> &[u8] {
let raw_ptr = self as *const T as *const u8;
unsafe { std::slice::from_raw_parts(raw_ptr, std::mem::size_of::<T>()) }
}
}