1pub 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
18pub struct VuePlugin {
20 graph_builder: VueGraphBuilder,
21}
22
23impl VuePlugin {
24 #[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}