swiftide_indexing/transformers/
metadata_qa_text.rs1use anyhow::Result;
8use async_trait::async_trait;
9use swiftide_core::{Transformer, indexing::TextNode};
10
11#[swiftide_macros::indexing_transformer(
15 metadata_field_name = "Questions and Answers (text)",
16 default_prompt_file = "prompts/metadata_qa_text.prompt.md"
17)]
18pub struct MetadataQAText {
19 #[builder(default = "5")]
20 num_questions: usize,
21}
22
23#[async_trait]
24impl Transformer for MetadataQAText {
25 type Input = String;
26 type Output = String;
27
28 #[tracing::instrument(skip_all, name = "transformers.metadata_qa_text")]
45 async fn transform_node(&self, mut node: TextNode) -> Result<TextNode> {
46 let prompt = self
47 .prompt_template
48 .clone()
49 .with_node(&node)
50 .with_context_value("questions", self.num_questions);
51
52 let response = self.prompt(prompt).await?;
53
54 node.metadata.insert(NAME, response);
55
56 Ok(node)
57 }
58
59 fn concurrency(&self) -> Option<usize> {
60 self.concurrency
61 }
62}
63
64#[cfg(test)]
65mod test {
66 use swiftide_core::MockSimplePrompt;
67
68 use super::*;
69
70 #[tokio::test]
71 async fn test_template() {
72 let template = default_prompt();
73
74 let prompt = template
75 .clone()
76 .with_node(&TextNode::new("test"))
77 .with_context_value("questions", 5);
78 insta::assert_snapshot!(prompt.render().unwrap());
79 }
80
81 #[tokio::test]
82 async fn test_metadata_qacode() {
83 let mut client = MockSimplePrompt::new();
84
85 client
86 .expect_prompt()
87 .returning(|_| Ok("Q1: Hello\nA1: World".to_string()));
88
89 let transformer = MetadataQAText::builder().client(client).build().unwrap();
90 let node = TextNode::new("Some text");
91
92 let result = transformer.transform_node(node).await.unwrap();
93
94 assert_eq!(
95 result.metadata.get("Questions and Answers (text)").unwrap(),
96 "Q1: Hello\nA1: World"
97 );
98 }
99}