use anyhow::Result;
use async_trait::async_trait;
use swiftide_core::Transformer;
use swiftide_core::indexing::TextNode;
use crate::treesitter::{CodeOutliner, SupportedLanguages};
#[swiftide_macros::indexing_transformer(metadata_field_name = "Outline", derive(skip_default))]
pub struct OutlineCodeTreeSitter {
outliner: CodeOutliner,
minimum_file_size: Option<usize>,
}
impl OutlineCodeTreeSitter {
pub fn try_for_language(
lang: impl TryInto<SupportedLanguages>,
minimum_file_size: Option<usize>,
) -> Result<Self> {
Ok(Self {
outliner: CodeOutliner::builder().try_language(lang)?.build()?,
minimum_file_size,
client: None,
concurrency: None,
indexing_defaults: None,
})
}
}
#[async_trait]
impl Transformer for OutlineCodeTreeSitter {
type Input = String;
type Output = String;
#[tracing::instrument(skip_all, name = "transformers.outline_code_tree_sitter")]
async fn transform_node(&self, mut node: TextNode) -> Result<TextNode> {
if let Some(minimum_file_size) = self.minimum_file_size
&& node.chunk.len() < minimum_file_size
{
return Ok(node);
}
let outline_result = self.outliner.outline(&node.chunk)?;
node.metadata.insert(NAME, outline_result);
Ok(node)
}
}