surrealdb-core-nightly 2.1.20250113

A nightly release of the surrealdb-core crate
Documentation
use crate::err::Error;
use crate::sql::value::Value;
use crate::sql::{Array, Object, Strand};
use std::collections::BTreeMap;

pub fn entries((object,): (Object,)) -> Result<Value, Error> {
	Ok(Value::Array(Array(
		object
			.iter()
			.map(|(k, v)| {
				Value::Array(Array(vec![Value::Strand(Strand(k.to_owned())), v.to_owned()]))
			})
			.collect(),
	)))
}

pub fn from_entries((array,): (Array,)) -> Result<Value, Error> {
	let mut obj: BTreeMap<String, Value> = BTreeMap::default();

	for v in array.iter() {
		match v {
			Value::Array(Array(entry)) if entry.len() == 2 => {
				let key = match entry.first() {
					Some(v) => match v {
						Value::Strand(v) => v.to_owned().to_raw(),
						v => v.to_string(),
					},
					_ => {
						return Err(Error::InvalidArguments {
							name: "object::from_entries".to_string(),
							message: "Expected entries, found invalid entry".to_string(),
						})
					}
				};

				let value = match entry.get(1) {
					Some(v) => v,
					_ => {
						return Err(Error::InvalidArguments {
							name: "object::from_entries".to_string(),
							message: "Expected entries, found invalid entry".to_string(),
						})
					}
				};

				obj.insert(key, value.to_owned());
			}
			_ => {
				return Err(Error::InvalidArguments {
					name: "object::from_entries".to_string(),
					message: format!("Expected entries, found {}", v.kindof()),
				})
			}
		}
	}

	Ok(Value::Object(Object(obj)))
}

pub fn is_empty((object,): (Object,)) -> Result<Value, Error> {
	Ok(Value::Bool(object.0.is_empty()))
}

pub fn len((object,): (Object,)) -> Result<Value, Error> {
	Ok(Value::from(object.len()))
}

pub fn keys((object,): (Object,)) -> Result<Value, Error> {
	Ok(Value::Array(Array(object.keys().map(|v| Value::Strand(Strand(v.to_owned()))).collect())))
}

pub fn values((object,): (Object,)) -> Result<Value, Error> {
	Ok(Value::Array(Array(object.values().map(|v| v.to_owned()).collect())))
}