on master help sign in
Return an error if we request an embedded file that does not exist.
5463a43Brian Dawn
helix-core/src/syntax.rs+22−3
@@ -82,14 +82,30 @@ fn load_runtime_file(language: &str, filename: &str) -> Result<String, std::io::
82
82
83#[cfg(feature = "embed_runtime")]
83#[cfg(feature = "embed_runtime")]
84fn load_runtime_file(language: &str, filename: &str) -> Result<String, Box<dyn std::error::Error>> {
84fn load_runtime_file(language: &str, filename: &str) -> Result<String, Box<dyn std::error::Error>> {
85+ use std::fmt;
86+
85 #[derive(rust_embed::RustEmbed)]
87 #[derive(rust_embed::RustEmbed)]
86 #[folder = "../runtime/"]
88 #[folder = "../runtime/"]
87 struct Runtime;
89 struct Runtime;
88
90
91+ #[derive(Debug)]
92+ struct EmbeddedFileNotFoundError {
93+ path: PathBuf,
94+ }
95+ impl std::error::Error for EmbeddedFileNotFoundError {}
96+ impl fmt::Display for EmbeddedFileNotFoundError {
97+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
98+ write!(f, "failed to load embedded file {}", self.path.display())
99+ }
100+ }
101+
89 let path = PathBuf::from("queries").join(language).join(filename);
102 let path = PathBuf::from("queries").join(language).join(filename);
90
103
91− let query_bytes = Runtime::get(&path.display().to_string()).unwrap_or_default();
104+ if let Some(query_bytes) = Runtime::get(&path.display().to_string()) {
92− String::from_utf8(query_bytes.to_vec()).map_err(|err| err.into())
105+ String::from_utf8(query_bytes.to_vec()).map_err(|err| err.into())
106+ } else {
107+ Err(Box::new(EmbeddedFileNotFoundError { path }))
108+ }
93}
109}
94
110
95fn read_query(language: &str, filename: &str) -> String {
111fn read_query(language: &str, filename: &str) -> String {
@@ -1722,5 +1738,8 @@ fn test_input_edits() {
1722fn test_load_runtime_file() {
1738fn test_load_runtime_file() {
1723 // Test to make sure we can load some data from the runtime directory.
1739 // Test to make sure we can load some data from the runtime directory.
1724 let contents = load_runtime_file("rust", "indents.toml").unwrap();
1740 let contents = load_runtime_file("rust", "indents.toml").unwrap();
1725− assert!(!contents.is_empty())
1741+ assert!(!contents.is_empty());
1742+
1743+ let results = load_runtime_file("rust", "does-not-exist");
1744+ assert!(results.is_err());
1726}
1745}