From dfe0c8664ee20300d562f6e059bcd33a4bb4c054 Mon Sep 17 00:00:00 2001 From: Louis Dureuil Date: Thu, 3 Jul 2025 11:08:31 +0200 Subject: [PATCH] Add a version of prompt::Context that has no fields --- crates/milli/src/prompt/context.rs | 34 ++++++++++++++------ crates/milli/src/vector/json_template/mod.rs | 3 +- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/crates/milli/src/prompt/context.rs b/crates/milli/src/prompt/context.rs index 84523333a..8958cb693 100644 --- a/crates/milli/src/prompt/context.rs +++ b/crates/milli/src/prompt/context.rs @@ -6,12 +6,18 @@ use liquid::{ObjectView, ValueView}; #[derive(Debug, Clone)] pub struct Context<'a, D: ObjectView, F: ArrayView> { document: &'a D, - fields: &'a F, + fields: Option<&'a F>, } impl<'a, D: ObjectView, F: ArrayView> Context<'a, D, F> { pub fn new(document: &'a D, fields: &'a F) -> Self { - Self { document, fields } + Self { document, fields: Some(fields) } + } +} + +impl<'a, D: ObjectView> Context<'a, D, Vec> { + pub fn without_fields(document: &'a D) -> Self { + Self { document, fields: None } } } @@ -21,17 +27,27 @@ impl ObjectView for Context<'_, D, F> { } fn size(&self) -> i64 { - 2 + if self.fields.is_some() { + 2 + } else { + 1 + } } fn keys<'k>(&'k self) -> Box> + 'k> { - Box::new(["doc", "fields"].iter().map(|s| KStringCow::from_static(s))) + let keys = if self.fields.is_some() { + either::Either::Left(["doc", "fields"]) + } else { + either::Either::Right(["doc"]) + }; + + Box::new(keys.into_iter().map(KStringCow::from_static)) } fn values<'k>(&'k self) -> Box + 'k> { Box::new( std::iter::once(self.document.as_value()) - .chain(std::iter::once(self.fields.as_value())), + .chain(self.fields.iter().map(|fields| fields.as_value())), ) } @@ -40,13 +56,13 @@ impl ObjectView for Context<'_, D, F> { } fn contains_key(&self, index: &str) -> bool { - index == "doc" || index == "fields" + index == "doc" || (index == "fields" && self.fields.is_some()) } fn get<'s>(&'s self, index: &str) -> Option<&'s dyn ValueView> { - match index { - "doc" => Some(self.document.as_value()), - "fields" => Some(self.fields.as_value()), + match (index, &self.fields) { + ("doc", _) => Some(self.document.as_value()), + ("fields", Some(fields)) => Some(fields.as_value()), _ => None, } } diff --git a/crates/milli/src/vector/json_template/mod.rs b/crates/milli/src/vector/json_template/mod.rs index 57a3b67b1..d7ce3e8f1 100644 --- a/crates/milli/src/vector/json_template/mod.rs +++ b/crates/milli/src/vector/json_template/mod.rs @@ -115,8 +115,7 @@ impl JsonTemplate { doc_alloc: &'doc Bump, ) -> Result { let document = ParseableDocument::new(document, doc_alloc); - let v: Vec = vec![]; - let context = crate::prompt::Context::new(&document, &v); + let context = crate::prompt::Context::without_fields(&document); self.render(&context) }