1use super::*;
2
3#[derive(Debug, PartialEq)]
4pub struct Import {
5 pub optional: bool,
6 pub path: TextNode,
7 pub range: lsp::Range,
8}
9
10impl Import {
11 #[must_use]
12 pub fn resolve(&self, base_uri: &lsp::Url) -> Option<PathBuf> {
13 let raw = self.path.value.trim_matches(|c| c == '\'' || c == '"');
14
15 if raw.is_empty() {
16 return None;
17 }
18
19 let path = if let Some(rest) = raw.strip_prefix("~/") {
20 dirs::home_dir()?.join(rest)
21 } else {
22 base_uri.to_file_path().ok()?.parent()?.join(raw)
23 };
24
25 Some(path)
26 }
27}
28
29#[cfg(test)]
30mod tests {
31 use {super::*, tempfile::Builder};
32
33 fn import(path: &str) -> Import {
34 Import {
35 optional: false,
36 path: TextNode {
37 value: path.to_owned(),
38 range: lsp::Range::default(),
39 },
40 range: lsp::Range::default(),
41 }
42 }
43
44 #[test]
45 fn empty_path_returns_none() {
46 let directory = Builder::new().prefix("just-lsp").tempdir().unwrap();
47
48 let base =
49 lsp::Url::from_file_path(directory.path().join("justfile")).unwrap();
50
51 assert_eq!(import("''").resolve(&base), None);
52 assert_eq!(import("\"\"").resolve(&base), None);
53 assert_eq!(import("").resolve(&base), None);
54 }
55
56 #[test]
57 fn home_directory() {
58 let directory = Builder::new().prefix("just-lsp").tempdir().unwrap();
59
60 let base =
61 lsp::Url::from_file_path(directory.path().join("justfile")).unwrap();
62
63 assert_eq!(
64 import("'~/bar.just'").resolve(&base).unwrap(),
65 dirs::home_dir().unwrap().join("bar.just"),
66 );
67 }
68
69 #[test]
70 fn resolve() {
71 let directory = Builder::new().prefix("just-lsp").tempdir().unwrap();
72
73 let base =
74 lsp::Url::from_file_path(directory.path().join("justfile")).unwrap();
75
76 assert_eq!(
77 import("'bar.just'").resolve(&base).unwrap(),
78 directory.path().join("bar.just")
79 );
80
81 assert_eq!(
82 import("\"bar.just\"").resolve(&base).unwrap(),
83 directory.path().join("bar.just")
84 );
85
86 assert_eq!(
87 import("bar.just").resolve(&base).unwrap(),
88 directory.path().join("bar.just")
89 );
90
91 assert_eq!(
92 import("'sub/bar.just'").resolve(&base).unwrap(),
93 directory.path().join("sub/bar.just")
94 );
95 }
96}