diff --git a/ffi/src/lib.rs b/ffi/src/lib.rs index 5d2c532ee..e718de0d6 100644 --- a/ffi/src/lib.rs +++ b/ffi/src/lib.rs @@ -1556,7 +1556,6 @@ pub unsafe extern "C" fn typed_value_into_long(typed_value: *mut Binding) -> c_l pub unsafe extern "C" fn typed_value_into_entid(typed_value: *mut Binding) -> Entid { assert_not_null!(typed_value); let typed_value = Box::from_raw(typed_value); - println!("typed value as entid {:?}", typed_value); unwrap_conversion(typed_value.into_entid(), ValueType::Ref) } @@ -1659,6 +1658,22 @@ pub unsafe extern "C" fn typed_value_value_type(typed_value: *mut Binding) -> Va typed_value.value_type().unwrap_or_else(|| panic!("Binding is not Scalar and has no ValueType")) } +/// Returns the [ValueType](mentat::ValueType) of this [Binding](mentat::Binding). +#[no_mangle] +pub unsafe extern "C" fn typed_value_value_type_kw(typed_value: *mut Binding) -> *mut c_char { + let typed_value = &*typed_value; + let value = typed_value.value_type().unwrap_or_else(|| panic!("Binding is not Scalar and has no ValueType")).into_edn_value().to_string(); + string_to_c_char(value.clone()) +} + +/// Returns the size of a `row` as usize +#[no_mangle] +pub unsafe extern "C" fn typed_value_list_size(values: *mut Vec) -> c_int { + assert_not_null!(values); + let values = &*values; + values.len () as c_int +} + /// Returns the value at the provided `index` as a `Vec`. /// If there is no value present at the `index`, a null pointer is returned. /// diff --git a/sdks/android/Mentat/library/src/main/java/org/mozilla/mentat/JNA.java b/sdks/android/Mentat/library/src/main/java/org/mozilla/mentat/JNA.java index 44ac12c2f..b118083be 100644 --- a/sdks/android/Mentat/library/src/main/java/org/mozilla/mentat/JNA.java +++ b/sdks/android/Mentat/library/src/main/java/org/mozilla/mentat/JNA.java @@ -156,7 +156,9 @@ class EntityBuilder extends PointerType {} double typed_value_into_double(TypedValue value); long typed_value_into_timestamp(TypedValue value); int typed_value_value_type(TypedValue value); + Pointer typed_value_value_type_kw(TypedValue value); + int typed_value_list_size(TypedValueList rows); TypedValueList row_at_index(RelResult rows, int index); RelResultIter typed_value_result_set_into_iter(RelResult rows); TypedValueList typed_value_result_set_iter_next(RelResultIter iter); diff --git a/sdks/android/Mentat/library/src/main/java/org/mozilla/mentat/TupleResult.java b/sdks/android/Mentat/library/src/main/java/org/mozilla/mentat/TupleResult.java index ef5a6ed2b..0211d052b 100644 --- a/sdks/android/Mentat/library/src/main/java/org/mozilla/mentat/TupleResult.java +++ b/sdks/android/Mentat/library/src/main/java/org/mozilla/mentat/TupleResult.java @@ -37,8 +37,11 @@ */ public class TupleResult extends RustObject { + private int size; + public TupleResult(JNA.TypedValueList pointer) { super(pointer); + this.size = JNA.INSTANCE.typed_value_list_size(super.validPointer()); } /** @@ -145,6 +148,14 @@ public UUID asUUID(Integer index) { JNA.INSTANCE.value_at_index_into_uuid(this.validPointer(), index)); } + /** + * Return the size of the tuple. + * @return The number of items in this tuple + */ + public int size () { + return this.size; + } + @Override protected void destroyPointer(JNA.TypedValueList p) { JNA.INSTANCE.typed_value_list_destroy(p); diff --git a/sdks/android/Mentat/library/src/main/java/org/mozilla/mentat/TypedValue.java b/sdks/android/Mentat/library/src/main/java/org/mozilla/mentat/TypedValue.java index cb19ca8f5..8f8d78b06 100644 --- a/sdks/android/Mentat/library/src/main/java/org/mozilla/mentat/TypedValue.java +++ b/sdks/android/Mentat/library/src/main/java/org/mozilla/mentat/TypedValue.java @@ -28,10 +28,16 @@ public class TypedValue extends RustObject { private Object value; + private String type = null; public TypedValue(JNA.TypedValue pointer) { super(pointer); - } + this.type = getAndConsumeMentatString(JNA.INSTANCE.typed_value_value_type_kw(super.validPointer())); + if ( this.type == null ) { + super.close (); + throw new IllegalArgumentException ("Failed to obtain Keyword for the valueType of this TypedValue"); + } + } /** * This value as a {@link Long}. This function will panic if the `ValueType` of this @@ -131,6 +137,14 @@ public UUID asUUID() { return (UUID)this.value; } + /** + * The :db/valueType of this value as a keyword {@link String}. + * @return the value type of this {@link TypedValue} as a Keyword + */ + public String valueTypeKeyword() { + return this.type; + } + @Override protected void destroyPointer(JNA.TypedValue p) { JNA.INSTANCE.typed_value_destroy(p);