mirror of
https://github.com/meilisearch/meilisearch.git
synced 2025-06-04 19:25:32 +00:00
Merge pull request #5593 from meilisearch/remove-template-checker
Remove TemplateChecker
This commit is contained in:
commit
5b67de0367
@ -18,6 +18,7 @@ impl NewPromptError {
|
|||||||
Self { kind: NewPromptErrorKind::CannotParseTemplate(inner), fault: FaultSource::User }
|
Self { kind: NewPromptErrorKind::CannotParseTemplate(inner), fault: FaultSource::User }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(unused)] // See <https://github.com/meilisearch/meilisearch/pull/5593> for explanation
|
||||||
pub(crate) fn invalid_fields_in_template(inner: liquid::Error) -> NewPromptError {
|
pub(crate) fn invalid_fields_in_template(inner: liquid::Error) -> NewPromptError {
|
||||||
Self { kind: NewPromptErrorKind::InvalidFieldsInTemplate(inner), fault: FaultSource::User }
|
Self { kind: NewPromptErrorKind::InvalidFieldsInTemplate(inner), fault: FaultSource::User }
|
||||||
}
|
}
|
||||||
@ -27,6 +28,7 @@ impl NewPromptError {
|
|||||||
pub enum NewPromptErrorKind {
|
pub enum NewPromptErrorKind {
|
||||||
#[error("cannot parse template: {0}")]
|
#[error("cannot parse template: {0}")]
|
||||||
CannotParseTemplate(liquid::Error),
|
CannotParseTemplate(liquid::Error),
|
||||||
|
#[allow(unused)] // See <https://github.com/meilisearch/meilisearch/pull/5593> for explanation
|
||||||
#[error("template contains invalid fields: {0}. Only `doc.*`, `fields[i].name`, `fields[i].value` are supported")]
|
#[error("template contains invalid fields: {0}. Only `doc.*`, `fields[i].name`, `fields[i].value` are supported")]
|
||||||
InvalidFieldsInTemplate(liquid::Error),
|
InvalidFieldsInTemplate(liquid::Error),
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,6 @@ mod context;
|
|||||||
mod document;
|
mod document;
|
||||||
pub(crate) mod error;
|
pub(crate) mod error;
|
||||||
mod fields;
|
mod fields;
|
||||||
mod template_checker;
|
|
||||||
|
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
use std::convert::TryFrom;
|
use std::convert::TryFrom;
|
||||||
@ -105,11 +104,6 @@ impl Prompt {
|
|||||||
max_bytes,
|
max_bytes,
|
||||||
};
|
};
|
||||||
|
|
||||||
// render template with special object that's OK with `doc.*` and `fields.*`
|
|
||||||
this.template
|
|
||||||
.render(&template_checker::TemplateChecker)
|
|
||||||
.map_err(NewPromptError::invalid_fields_in_template)?;
|
|
||||||
|
|
||||||
Ok(this)
|
Ok(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -206,6 +200,7 @@ mod test {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
#[ignore] // See <https://github.com/meilisearch/meilisearch/pull/5593> for explanation
|
||||||
fn template_missing_doc() {
|
fn template_missing_doc() {
|
||||||
assert!(matches!(
|
assert!(matches!(
|
||||||
Prompt::new("{{title}}: {{overview}}".into(), None),
|
Prompt::new("{{title}}: {{overview}}".into(), None),
|
||||||
@ -236,6 +231,7 @@ mod test {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
#[ignore] // See <https://github.com/meilisearch/meilisearch/pull/5593> for explanation
|
||||||
fn template_fields_invalid() {
|
fn template_fields_invalid() {
|
||||||
assert!(matches!(
|
assert!(matches!(
|
||||||
// intentionally garbled field
|
// intentionally garbled field
|
||||||
|
@ -1,301 +0,0 @@
|
|||||||
use liquid::model::{
|
|
||||||
ArrayView, DisplayCow, KStringCow, ObjectRender, ObjectSource, State, Value as LiquidValue,
|
|
||||||
};
|
|
||||||
use liquid::{Object, ObjectView, ValueView};
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub struct TemplateChecker;
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub struct DummyDoc;
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub struct DummyFields;
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub struct DummyField;
|
|
||||||
|
|
||||||
const DUMMY_VALUE: &LiquidValue = &LiquidValue::Nil;
|
|
||||||
|
|
||||||
impl ObjectView for DummyField {
|
|
||||||
fn as_value(&self) -> &dyn ValueView {
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
fn size(&self) -> i64 {
|
|
||||||
2
|
|
||||||
}
|
|
||||||
|
|
||||||
fn keys<'k>(&'k self) -> Box<dyn Iterator<Item = KStringCow<'k>> + 'k> {
|
|
||||||
Box::new(["name", "value"].iter().map(|s| KStringCow::from_static(s)))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn values<'k>(&'k self) -> Box<dyn Iterator<Item = &'k dyn ValueView> + 'k> {
|
|
||||||
Box::new(vec![DUMMY_VALUE.as_view(), DUMMY_VALUE.as_view()].into_iter())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn iter<'k>(&'k self) -> Box<dyn Iterator<Item = (KStringCow<'k>, &'k dyn ValueView)> + 'k> {
|
|
||||||
Box::new(self.keys().zip(self.values()))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn contains_key(&self, index: &str) -> bool {
|
|
||||||
index == "name" || index == "value"
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get<'s>(&'s self, index: &str) -> Option<&'s dyn ValueView> {
|
|
||||||
if self.contains_key(index) {
|
|
||||||
Some(DUMMY_VALUE.as_view())
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ValueView for DummyField {
|
|
||||||
fn as_debug(&self) -> &dyn std::fmt::Debug {
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
fn render(&self) -> DisplayCow<'_> {
|
|
||||||
DUMMY_VALUE.render()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn source(&self) -> DisplayCow<'_> {
|
|
||||||
DUMMY_VALUE.source()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn type_name(&self) -> &'static str {
|
|
||||||
"object"
|
|
||||||
}
|
|
||||||
|
|
||||||
fn query_state(&self, state: State) -> bool {
|
|
||||||
match state {
|
|
||||||
State::Truthy => true,
|
|
||||||
State::DefaultValue => false,
|
|
||||||
State::Empty => false,
|
|
||||||
State::Blank => false,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn to_kstr(&self) -> KStringCow<'_> {
|
|
||||||
DUMMY_VALUE.to_kstr()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn to_value(&self) -> LiquidValue {
|
|
||||||
let mut this = Object::new();
|
|
||||||
this.insert("name".into(), LiquidValue::Nil);
|
|
||||||
this.insert("value".into(), LiquidValue::Nil);
|
|
||||||
LiquidValue::Object(this)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn as_object(&self) -> Option<&dyn ObjectView> {
|
|
||||||
Some(self)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ValueView for DummyFields {
|
|
||||||
fn as_debug(&self) -> &dyn std::fmt::Debug {
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
fn render(&self) -> DisplayCow<'_> {
|
|
||||||
DUMMY_VALUE.render()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn source(&self) -> DisplayCow<'_> {
|
|
||||||
DUMMY_VALUE.source()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn type_name(&self) -> &'static str {
|
|
||||||
"array"
|
|
||||||
}
|
|
||||||
|
|
||||||
fn query_state(&self, state: State) -> bool {
|
|
||||||
match state {
|
|
||||||
State::Truthy => true,
|
|
||||||
State::DefaultValue => false,
|
|
||||||
State::Empty => false,
|
|
||||||
State::Blank => false,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn to_kstr(&self) -> KStringCow<'_> {
|
|
||||||
DUMMY_VALUE.to_kstr()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn to_value(&self) -> LiquidValue {
|
|
||||||
LiquidValue::Array(vec![DummyField.to_value()])
|
|
||||||
}
|
|
||||||
|
|
||||||
fn as_array(&self) -> Option<&dyn ArrayView> {
|
|
||||||
Some(self)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ArrayView for DummyFields {
|
|
||||||
fn as_value(&self) -> &dyn ValueView {
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
fn size(&self) -> i64 {
|
|
||||||
u16::MAX as i64
|
|
||||||
}
|
|
||||||
|
|
||||||
fn values<'k>(&'k self) -> Box<dyn Iterator<Item = &'k dyn ValueView> + 'k> {
|
|
||||||
Box::new(std::iter::once(DummyField.as_value()))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn contains_key(&self, index: i64) -> bool {
|
|
||||||
index < self.size()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get(&self, _index: i64) -> Option<&dyn ValueView> {
|
|
||||||
Some(DummyField.as_value())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ObjectView for DummyDoc {
|
|
||||||
fn as_value(&self) -> &dyn ValueView {
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
fn size(&self) -> i64 {
|
|
||||||
1000
|
|
||||||
}
|
|
||||||
|
|
||||||
fn keys<'k>(&'k self) -> Box<dyn Iterator<Item = KStringCow<'k>> + 'k> {
|
|
||||||
Box::new(std::iter::empty())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn values<'k>(&'k self) -> Box<dyn Iterator<Item = &'k dyn ValueView> + 'k> {
|
|
||||||
Box::new(std::iter::empty())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn iter<'k>(&'k self) -> Box<dyn Iterator<Item = (KStringCow<'k>, &'k dyn ValueView)> + 'k> {
|
|
||||||
Box::new(std::iter::empty())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn contains_key(&self, _index: &str) -> bool {
|
|
||||||
true
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get<'s>(&'s self, _index: &str) -> Option<&'s dyn ValueView> {
|
|
||||||
// Recursively sends itself
|
|
||||||
Some(self)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ValueView for DummyDoc {
|
|
||||||
fn as_debug(&self) -> &dyn std::fmt::Debug {
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
fn render(&self) -> DisplayCow<'_> {
|
|
||||||
DUMMY_VALUE.render()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn source(&self) -> DisplayCow<'_> {
|
|
||||||
DUMMY_VALUE.source()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn type_name(&self) -> &'static str {
|
|
||||||
"object"
|
|
||||||
}
|
|
||||||
|
|
||||||
fn query_state(&self, state: State) -> bool {
|
|
||||||
match state {
|
|
||||||
State::Truthy => true,
|
|
||||||
State::DefaultValue => false,
|
|
||||||
State::Empty => false,
|
|
||||||
State::Blank => false,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn to_kstr(&self) -> KStringCow<'_> {
|
|
||||||
DUMMY_VALUE.to_kstr()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn to_value(&self) -> LiquidValue {
|
|
||||||
LiquidValue::Nil
|
|
||||||
}
|
|
||||||
|
|
||||||
fn as_object(&self) -> Option<&dyn ObjectView> {
|
|
||||||
Some(self)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ObjectView for TemplateChecker {
|
|
||||||
fn as_value(&self) -> &dyn ValueView {
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
fn size(&self) -> i64 {
|
|
||||||
2
|
|
||||||
}
|
|
||||||
|
|
||||||
fn keys<'k>(&'k self) -> Box<dyn Iterator<Item = KStringCow<'k>> + 'k> {
|
|
||||||
Box::new(["doc", "fields"].iter().map(|s| KStringCow::from_static(s)))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn values<'k>(&'k self) -> Box<dyn Iterator<Item = &'k dyn ValueView> + 'k> {
|
|
||||||
Box::new(
|
|
||||||
std::iter::once(DummyDoc.as_value()).chain(std::iter::once(DummyFields.as_value())),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn iter<'k>(&'k self) -> Box<dyn Iterator<Item = (KStringCow<'k>, &'k dyn ValueView)> + 'k> {
|
|
||||||
Box::new(self.keys().zip(self.values()))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn contains_key(&self, index: &str) -> bool {
|
|
||||||
index == "doc" || index == "fields"
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get<'s>(&'s self, index: &str) -> Option<&'s dyn ValueView> {
|
|
||||||
match index {
|
|
||||||
"doc" => Some(DummyDoc.as_value()),
|
|
||||||
"fields" => Some(DummyFields.as_value()),
|
|
||||||
_ => None,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ValueView for TemplateChecker {
|
|
||||||
fn as_debug(&self) -> &dyn std::fmt::Debug {
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
fn render(&self) -> liquid::model::DisplayCow<'_> {
|
|
||||||
DisplayCow::Owned(Box::new(ObjectRender::new(self)))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn source(&self) -> liquid::model::DisplayCow<'_> {
|
|
||||||
DisplayCow::Owned(Box::new(ObjectSource::new(self)))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn type_name(&self) -> &'static str {
|
|
||||||
"object"
|
|
||||||
}
|
|
||||||
|
|
||||||
fn query_state(&self, state: liquid::model::State) -> bool {
|
|
||||||
match state {
|
|
||||||
State::Truthy => true,
|
|
||||||
State::DefaultValue | State::Empty | State::Blank => false,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn to_kstr(&self) -> liquid::model::KStringCow<'_> {
|
|
||||||
let s = ObjectRender::new(self).to_string();
|
|
||||||
KStringCow::from_string(s)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn to_value(&self) -> LiquidValue {
|
|
||||||
LiquidValue::Object(
|
|
||||||
self.iter().map(|(k, x)| (k.to_string().into(), x.to_value())).collect(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn as_object(&self) -> Option<&dyn ObjectView> {
|
|
||||||
Some(self)
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user