sqlxo 0.9.1

sqlxo: small SQL query builder + derives for filterable ORM-ish patterns
Documentation
use sqlxo::{
	and,
	blocks::{
		Expression,
		SortOrder,
	},
	one,
	or,
	order_by,
};

use crate::helpers::{
	ItemColumn,
	ItemQuery,
	ItemSort,
};

#[test]
fn expression_macros() {
	let plain_query = Expression::Or(vec![
		Expression::And(vec![
			Expression::Leaf(ItemQuery::NameLike("%SternLampe%".into())),
			Expression::Leaf(ItemQuery::DescriptionNeq("Hohlweg".into())),
		]),
		Expression::Leaf(ItemQuery::PriceGt(1800f32)),
	]);

	let long_macro_query = or![
		and![
			Expression::Leaf(ItemQuery::NameLike("%SternLampe%".into())),
			Expression::Leaf(ItemQuery::DescriptionNeq("Hohlweg".into())),
		],
		Expression::Leaf(ItemQuery::PriceGt(1800f32)),
	];

	let short_macro_query = or![
		and![
			ItemQuery::NameLike("%SternLampe%".into()),
			ItemQuery::DescriptionNeq("Hohlweg".into()),
		],
		ItemQuery::PriceGt(1800f32),
	];

	assert_eq!(plain_query, long_macro_query);
	assert_eq!(long_macro_query, short_macro_query);
}

#[test]
#[allow(unused_parens)]
fn one_macro_builds_single_expression() {
	let plain_query = Expression::Leaf(ItemQuery::NameEq("a".into()));
	let macro_query: Expression<ItemQuery> =
		one! {(ItemQuery::NameEq("a".into()))};

	assert_eq!(plain_query, macro_query);
}

#[test]
fn sort_macros() {
	let plain_sort =
		SortOrder(vec![ItemSort::ByAmountAsc, ItemSort::ByNameDesc]);
	let short_macro_sort =
		order_by![ItemSort::ByAmountAsc, ItemSort::ByNameDesc];

	assert_eq!(plain_sort, short_macro_sort);
}

#[test]
fn take_macro_emits_selection_list_for_blocks() {
	let plain_take = &["id", "name"];
	let macro_take = sqlxo::take!(ItemColumn::Id, ItemColumn::Name);

	let macro_cols: Vec<_> = macro_take
		.clone()
		.expect_columns()
		.columns()
		.iter()
		.map(|col| col.column)
		.collect();

	assert_eq!(plain_take, macro_cols.as_slice());
}