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