Skip to main content

sqry_lang_vue/
lib.rs

1//! Vue language plugin for sqry.
2//!
3//! Provides AST parsing, scope extraction stubs, and graph building for
4//! Vue Single-File Components.
5
6pub mod relations;
7
8pub use relations::VueGraphBuilder;
9
10use sqry_core::ast::Scope;
11use sqry_core::plugin::{
12    LanguageMetadata, LanguagePlugin,
13    error::{ParseError, ScopeError},
14};
15use std::path::Path;
16use tree_sitter::{Parser, Tree};
17
18/// Vue language plugin.
19pub struct VuePlugin {
20    graph_builder: VueGraphBuilder,
21}
22
23impl VuePlugin {
24    /// Creates a new Vue plugin instance.
25    #[must_use]
26    pub fn new() -> Self {
27        Self {
28            graph_builder: VueGraphBuilder::default(),
29        }
30    }
31}
32
33impl Default for VuePlugin {
34    fn default() -> Self {
35        Self::new()
36    }
37}
38
39impl LanguagePlugin for VuePlugin {
40    fn metadata(&self) -> LanguageMetadata {
41        LanguageMetadata {
42            id: "vue",
43            name: "Vue",
44            version: env!("CARGO_PKG_VERSION"),
45            author: "Verivus Pty Ltd",
46            description: "Vue.js Single-File Component support for sqry",
47            tree_sitter_version: "0.25",
48        }
49    }
50
51    fn extensions(&self) -> &'static [&'static str] {
52        &["vue"]
53    }
54
55    fn language(&self) -> tree_sitter::Language {
56        tree_sitter_vue_sqry::language()
57    }
58
59    fn parse_ast(&self, content: &[u8]) -> Result<Tree, ParseError> {
60        let mut parser = Parser::new();
61        parser
62            .set_language(&self.language())
63            .map_err(|e| ParseError::LanguageSetFailed(e.to_string()))?;
64
65        parser
66            .parse(content, None)
67            .ok_or(ParseError::TreeSitterFailed)
68    }
69
70    fn extract_scopes(
71        &self,
72        _tree: &Tree,
73        _content: &[u8],
74        _file_path: &Path,
75    ) -> Result<Vec<Scope>, ScopeError> {
76        Ok(Vec::new())
77    }
78
79    fn graph_builder(&self) -> Option<&dyn sqry_core::graph::GraphBuilder> {
80        Some(&self.graph_builder)
81    }
82}
83
84#[cfg(test)]
85mod tests {
86    use super::*;
87
88    #[test]
89    fn test_plugin_metadata() {
90        let plugin = VuePlugin::default();
91        let metadata = plugin.metadata();
92        assert_eq!(metadata.id, "vue");
93        assert_eq!(metadata.name, "Vue");
94    }
95
96    #[test]
97    fn test_extensions() {
98        let plugin = VuePlugin::default();
99        assert_eq!(plugin.extensions(), &["vue"]);
100    }
101
102    #[test]
103    fn test_can_parse() {
104        let plugin = VuePlugin::default();
105        let content = b"<template><div>Hello</div></template>";
106        let tree = plugin.parse_ast(content);
107        assert!(tree.is_ok());
108    }
109}