swiftide_indexing/transformers/
metadata_keywords.rs1use anyhow::Result;
7use async_trait::async_trait;
8use swiftide_core::{Transformer, indexing::TextNode};
9
10#[swiftide_macros::indexing_transformer(
14 default_prompt_file = "prompts/metadata_keywords.prompt.md",
15 metadata_field_name = "Keywords"
16)]
17pub struct MetadataKeywords {}
18
19#[async_trait]
20impl Transformer for MetadataKeywords {
21 type Input = String;
22 type Output = String;
23
24 #[tracing::instrument(skip_all, name = "transformers.metadata_keywords")]
41 async fn transform_node(&self, mut node: TextNode) -> Result<TextNode> {
42 let prompt = self.prompt_template.clone().with_node(&node);
43 let response = self.prompt(prompt).await?;
44
45 node.metadata.insert(NAME, response);
46
47 Ok(node)
48 }
49
50 fn concurrency(&self) -> Option<usize> {
51 self.concurrency
52 }
53}
54
55#[cfg(test)]
56mod test {
57 use swiftide_core::MockSimplePrompt;
58
59 use super::*;
60
61 #[test_log::test(tokio::test)]
62 async fn test_template() {
63 let template = default_prompt();
64
65 let prompt = template.clone().with_node(&TextNode::new("test"));
66 insta::assert_snapshot!(prompt.render().unwrap());
67 }
68
69 #[tokio::test]
70 async fn test_metadata_keywords() {
71 let mut client = MockSimplePrompt::new();
72
73 client
74 .expect_prompt()
75 .returning(|_| Ok("important,keywords".to_string()));
76
77 let transformer = MetadataKeywords::builder().client(client).build().unwrap();
78 let node = TextNode::new("Some text");
79
80 let result = transformer.transform_node(node).await.unwrap();
81
82 assert_eq!(
83 result.metadata.get("Keywords").unwrap(),
84 "important,keywords"
85 );
86 }
87}