Skip to main content

just_lsp/
import.rs

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}