use crate::Value;
use crate::types::c_api::{
linkrs_string_t, linkrs_value_data_t, linkrs_value_t, linkrs_value_type_t,
};
pub fn core_value_to_linkrs(value: &Value) -> linkrs_value_t {
match value {
Value::Null(_) => linkrs_value_t {
type_: linkrs_value_type_t::LINKRS_NULL,
data: linkrs_value_data_t {
ptr: std::ptr::null_mut(),
},
},
Value::Bool(b) => linkrs_value_t {
type_: linkrs_value_type_t::LINKRS_BOOL,
data: linkrs_value_data_t { boolean: *b },
},
Value::Int(i) => linkrs_value_t {
type_: linkrs_value_type_t::LINKRS_INT,
data: linkrs_value_data_t { integer: *i as i64 },
},
Value::Float(f) => linkrs_value_t {
type_: linkrs_value_type_t::LINKRS_FLOAT,
data: linkrs_value_data_t {
floating: *f as f64,
},
},
Value::String(s) => {
let string_t = linkrs_string_t {
data: s.as_ptr() as *const i8,
len: s.len(),
};
linkrs_value_t {
type_: linkrs_value_type_t::LINKRS_STRING,
data: linkrs_value_data_t { string: string_t },
}
}
_ => linkrs_value_t {
type_: linkrs_value_type_t::LINKRS_NULL,
data: linkrs_value_data_t {
ptr: std::ptr::null_mut(),
},
},
}
}
pub fn core_value_to_linkrs_type(value: &Value) -> linkrs_value_type_t {
match value {
Value::Null(_) => linkrs_value_type_t::LINKRS_NULL,
Value::Bool(_) => linkrs_value_type_t::LINKRS_BOOL,
Value::Int(_) => linkrs_value_type_t::LINKRS_INT,
Value::Float(_) => linkrs_value_type_t::LINKRS_FLOAT,
Value::String(_) => linkrs_value_type_t::LINKRS_STRING,
Value::List(_) => linkrs_value_type_t::LINKRS_LIST,
Value::Map(_) => linkrs_value_type_t::LINKRS_MAP,
Value::Vertex(_) => linkrs_value_type_t::LINKRS_VERTEX,
Value::Edge(_) | Value::EdgeHeader(_) => linkrs_value_type_t::LINKRS_EDGE,
Value::Path(_) => linkrs_value_type_t::LINKRS_PATH,
_ => linkrs_value_type_t::LINKRS_NULL,
}
}