surrealdb-sql 1.1.0

Full type definitions for the SurrealQL query language
Documentation
mod mtreeparams;
mod searchparams;

use crate::err::Error;
use crate::index::Index;
use crate::value::serde::ser;
use serde::ser::Error as _;
use serde::ser::Impossible;
use serde::ser::Serialize;

pub(super) struct Serializer;

impl ser::Serializer for Serializer {
	type Ok = Index;
	type Error = Error;

	type SerializeSeq = Impossible<Index, Error>;
	type SerializeTuple = Impossible<Index, Error>;
	type SerializeTupleStruct = Impossible<Index, Error>;
	type SerializeTupleVariant = Impossible<Index, Error>;
	type SerializeMap = Impossible<Index, Error>;
	type SerializeStruct = Impossible<Index, Error>;
	type SerializeStructVariant = Impossible<Index, Error>;

	const EXPECTED: &'static str = "an enum `Index`";

	#[inline]
	fn serialize_unit_variant(
		self,
		name: &'static str,
		_variant_index: u32,
		variant: &'static str,
	) -> Result<Self::Ok, Error> {
		match variant {
			"Idx" => Ok(Index::Idx),
			"Uniq" => Ok(Index::Uniq),
			variant => Err(Error::custom(format!("unexpected unit variant `{name}::{variant}`"))),
		}
	}

	#[inline]
	fn serialize_newtype_variant<T>(
		self,
		name: &'static str,
		_variant_index: u32,
		variant: &'static str,
		value: &T,
	) -> Result<Self::Ok, Error>
	where
		T: ?Sized + Serialize,
	{
		match variant {
			"Search" => Ok(Index::Search(value.serialize(searchparams::Serializer.wrap())?)),
			"MTree" => Ok(Index::MTree(value.serialize(mtreeparams::Serializer.wrap())?)),
			variant => {
				Err(Error::custom(format!("unexpected newtype variant `{name}::{variant}`")))
			}
		}
	}
}

#[cfg(test)]
mod tests {
	use super::*;
	use crate::index::SearchParams;
	use crate::value::serde::ser::Serializer;
	use crate::Scoring;

	#[test]
	fn idx() {
		let idx = Index::Idx;
		let serialized = idx.serialize(Serializer.wrap()).unwrap();
		assert_eq!(idx, serialized);
	}

	#[test]
	fn uniq() {
		let idx = Index::Uniq;
		let serialized = idx.serialize(Serializer.wrap()).unwrap();
		assert_eq!(idx, serialized);
	}

	#[test]
	fn search() {
		let idx = Index::Search(SearchParams {
			az: Default::default(),
			hl: Default::default(),
			sc: Scoring::Bm {
				k1: Default::default(),
				b: Default::default(),
			},
			doc_ids_order: Default::default(),
			doc_lengths_order: Default::default(),
			postings_order: Default::default(),
			terms_order: Default::default(),
		});
		let serialized = idx.serialize(Serializer.wrap()).unwrap();
		assert_eq!(idx, serialized);
	}
}