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