Skip to main content

linkrs_core/
value_conversion.rs

1//! C API Value Type Conversion Module
2//!
3//! Provides conversions between linkrs_value_t and core::Value.
4
5use crate::Value;
6
7use crate::types::c_api::{
8    linkrs_string_t, linkrs_value_data_t, linkrs_value_t, linkrs_value_type_t,
9};
10
11/// Converting Core Value to C API Value Types
12pub fn core_value_to_linkrs(value: &Value) -> linkrs_value_t {
13    match value {
14        Value::Null(_) => linkrs_value_t {
15            type_: linkrs_value_type_t::LINKRS_NULL,
16            data: linkrs_value_data_t {
17                ptr: std::ptr::null_mut(),
18            },
19        },
20        Value::Bool(b) => linkrs_value_t {
21            type_: linkrs_value_type_t::LINKRS_BOOL,
22            data: linkrs_value_data_t { boolean: *b },
23        },
24        Value::Int(i) => linkrs_value_t {
25            type_: linkrs_value_type_t::LINKRS_INT,
26            data: linkrs_value_data_t { integer: *i as i64 },
27        },
28        Value::Float(f) => linkrs_value_t {
29            type_: linkrs_value_type_t::LINKRS_FLOAT,
30            data: linkrs_value_data_t {
31                floating: *f as f64,
32            },
33        },
34        Value::String(s) => {
35            let string_t = linkrs_string_t {
36                data: s.as_ptr() as *const i8,
37                len: s.len(),
38            };
39            linkrs_value_t {
40                type_: linkrs_value_type_t::LINKRS_STRING,
41                data: linkrs_value_data_t { string: string_t },
42            }
43        }
44        _ => linkrs_value_t {
45            type_: linkrs_value_type_t::LINKRS_NULL,
46            data: linkrs_value_data_t {
47                ptr: std::ptr::null_mut(),
48            },
49        },
50    }
51}
52
53/// C API type to get Core Value
54pub fn core_value_to_linkrs_type(value: &Value) -> linkrs_value_type_t {
55    match value {
56        Value::Null(_) => linkrs_value_type_t::LINKRS_NULL,
57        Value::Bool(_) => linkrs_value_type_t::LINKRS_BOOL,
58        Value::Int(_) => linkrs_value_type_t::LINKRS_INT,
59        Value::Float(_) => linkrs_value_type_t::LINKRS_FLOAT,
60        Value::String(_) => linkrs_value_type_t::LINKRS_STRING,
61        Value::List(_) => linkrs_value_type_t::LINKRS_LIST,
62        Value::Map(_) => linkrs_value_type_t::LINKRS_MAP,
63        Value::Vertex(_) => linkrs_value_type_t::LINKRS_VERTEX,
64        Value::Edge(_) | Value::EdgeHeader(_) => linkrs_value_type_t::LINKRS_EDGE,
65        Value::Path(_) => linkrs_value_type_t::LINKRS_PATH,
66        _ => linkrs_value_type_t::LINKRS_NULL,
67    }
68}