@@ -82,14 +82,30 @@ fn load_runtime_file(language: &str, filename: &str) -> Result<String, std::io::
8282
8383#[cfg(feature = "embed_runtime")]
8484fn load_runtime_file(language: &str, filename: &str) -> Result<String, Box<dyn std::error::Error>> {
85+ use std::fmt;
86+
8587 #[derive(rust_embed::RustEmbed)]
8688 #[folder = "../runtime/"]
8789 struct Runtime;
8890
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+
89102 let path = PathBuf::from("queries").join(language).join(filename);
90103
91− let query_bytes = Runtime::get(&path.display().to_string()).unwrap_or_default();
92− String::from_utf8(query_bytes.to_vec()).map_err(|err| err.into())
104+ if let Some(query_bytes) = Runtime::get(&path.display().to_string()) {
105+ String::from_utf8(query_bytes.to_vec()).map_err(|err| err.into())
106+ } else {
107+ Err(Box::new(EmbeddedFileNotFoundError { path }))
108+ }
93109}
94110
95111fn read_query(language: &str, filename: &str) -> String {
@@ -1722,5 +1738,8 @@ fn test_input_edits() {
17221738fn test_load_runtime_file() {
17231739 // Test to make sure we can load some data from the runtime directory.
17241740 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());
17261745}