unobtanium 3.0.0

Opinioated Web search engine library with crawler and viewer companion.
Documentation
use std::ops::Deref;

use criterium::DirectMatch;
use criterium::rusqlite::assembler::*;
use criterium::StringCriterium;
use serde::{Serialize,Deserialize};

use crate::database::SummarySchema;
use crate::database::fields::*;
use crate::summary::TextPile;

use super::BlobCriterium;

#[derive(Clone,Debug,Serialize,Deserialize)]
#[serde(rename_all="snake_case")]
pub enum TextPileCriterium {
	IsEmpty,
	Text(StringCriterium),
	SecondaryText(StringCriterium),
	BigHeadlines(StringCriterium),
	SmallHeadlines(StringCriterium),
	CodeText(StringCriterium),
	QuoteText(StringCriterium),
	Blake2b512Digest(BlobCriterium),
}

impl AssembleRusqliteQuery<SummarySchema, ()> for TextPileCriterium {
	fn assemble_rusqlite_query(
		&self,
		assembly_context: &AssemblyContext,
		_context: &(),
	) -> InvertableRusqliteQuery<SummarySchema> {
		match self {
			Self::IsEmpty => {
				RusqliteQuery::from_static_sql(format!(
					"(
						{0}text_pile.text = '' AND
						{0}text_pile.seondary_text = '' AND
						{0}text_pile.big_headlines = '' AND
						{0}text_pile.smll_headlines = '' AND
						{0}text_pile.code_text = '' AND
						{0}text_pile.quote_text = ''
					)", assembly_context.prefix()
				)).as_invertable()
			},
			Self::Text(c) => {
				c.assemble_query(assembly_context, &TextPileField::Text.into())
			},
			Self::SecondaryText(c) => {
				c.assemble_query(assembly_context, &TextPileField::SecondaryText.into())
			},
			Self::BigHeadlines(c) => {
				c.assemble_query(assembly_context, &TextPileField::BigHeadlines.into())
			},
			Self::SmallHeadlines(c) => {
				c.assemble_query(assembly_context, &TextPileField::SmallHeadlines.into())
			},
			Self::CodeText(c) => {
				c.assemble_query(assembly_context, &TextPileField::CodeText.into())
			},
			Self::QuoteText(c) => {
				c.assemble_query(assembly_context, &TextPileField::QuoteText.into())
			},
			Self::Blake2b512Digest(c) => {
				c.assemble_query(assembly_context, &TextPileField::Blake2b512Digest.into())
			},
		} 
	}
}

impl DirectMatch<TextPile> for TextPileCriterium {

	type Output =  bool;
	
	fn criterium_match(&self, data: &TextPile) -> bool {
	    match self {
			Self::IsEmpty => {
				data.is_empty()
			},
			Self::Text(c) => {
				c.criterium_match(data.text.as_str())
			},
			Self::SecondaryText(c) => {
				c.criterium_match(data.secondary_text.as_str())
			},
			Self::BigHeadlines(c) => {
				c.criterium_match(data.big_headlines.as_str())
			},
			Self::SmallHeadlines(c) => {
				c.criterium_match(data.small_headlines.as_str())
			},
			Self::CodeText(c) => {
				c.criterium_match(data.code_text.as_str())
			},
			Self::QuoteText(c) => {
				c.criterium_match(data.quote_text.as_str())
			},
			Self::Blake2b512Digest(c) => {
				c.criterium_match(data.calculate_blake2b512_digest().deref())
			},
	    }
	}
}