on master help sign in
Refactor HighlightingAssets::get_syntax to return Result type
commit5aa20c090bb01abf1fd2266bad35413447eff846 authorEthan P <eth-p+git@hidden.email> dateFri 15 May 2020, 17:52 (6 years ago) parent9c371ed
3 files changed+54−28
src/assets.rs+39−27 src/error.rs+11 src/printer.rs+4−1
src/assets.rs+39−27
@@ -190,11 +190,15 @@ impl HighlightingAssets {
190190 language: Option<&str>,
191191 input: &mut OpenedInput,
192192 mapping: &SyntaxMapping,
193− ) -> &SyntaxReference {
194− let syntax = if input.kind.is_theme_preview_file() {
195− self.syntax_set.find_syntax_by_name("Rust")
193+ ) -> Result<&SyntaxReference> {
194+ if input.kind.is_theme_preview_file() {
195+ self.syntax_set
196+ .find_syntax_by_name("Rust")
197+ .ok_or_else(|| ErrorKind::UnknownSyntax("Rust".to_owned()).into())
196198 } else if let Some(language) = language {
197− self.syntax_set.find_syntax_by_token(language)
199+ self.syntax_set
200+ .find_syntax_by_token(language)
201+ .ok_or_else(|| ErrorKind::UnknownSyntax(language.to_owned()).into())
198202 } else {
199203 let line_syntax = self.get_first_line_syntax(&mut input.reader);
200204
@@ -217,24 +221,29 @@ impl HighlightingAssets {
217221 let absolute_path = path.canonicalize().ok().unwrap_or_else(|| path.to_owned());
218222
219223 match mapping.get_syntax_for(absolute_path) {
220− Some(MappingTarget::MapToUnknown) => line_syntax,
221− Some(MappingTarget::MapTo(syntax_name)) => {
222− // TODO: we should probably return an error here if this syntax can not be
223− // found. Currently, we just fall back to 'plain'.
224− self.syntax_set.find_syntax_by_name(syntax_name)
225− }
224+ Some(MappingTarget::MapToUnknown) => line_syntax.ok_or_else(|| {
225+ ErrorKind::UndetectedSyntax(path.to_string_lossy().into()).into()
226+ }),
227+
228+ Some(MappingTarget::MapTo(syntax_name)) => self
229+ .syntax_set
230+ .find_syntax_by_name(syntax_name)
231+ .ok_or_else(|| ErrorKind::UnknownSyntax(syntax_name.to_owned()).into()),
232+
226233 None => {
227234 let file_name = path.file_name().unwrap_or_default();
228− self.get_extension_syntax(file_name).or(line_syntax)
235+ self.get_extension_syntax(file_name)
236+ .or(line_syntax)
237+ .ok_or_else(|| {
238+ ErrorKind::UndetectedSyntax(path.to_string_lossy().into()).into()
239+ })
229240 }
230241 }
231242 } else {
232243 // If a path wasn't provided, we fall back to the detect first-line syntax.
233− line_syntax
244+ line_syntax.ok_or_else(|| ErrorKind::UndetectedSyntax("[unknown]".into()).into())
234245 }
235− };
236−
237− syntax.unwrap_or_else(|| self.syntax_set.find_syntax_plain_text())
246+ }
238247 }
239248
240249 fn get_extension_syntax(&self, file_name: &OsStr) -> Option<&SyntaxReference> {
@@ -299,11 +308,12 @@ mod tests {
299308 let input = Input::ordinary_file(file_path.as_os_str());
300309 let dummy_stdin: &[u8] = &[];
301310 let mut opened_input = input.open(dummy_stdin).unwrap();
302− let syntax = self
303− .assets
304− .get_syntax(None, &mut opened_input, &self.syntax_mapping);
305311
306− syntax.name.clone()
312+ self.assets
313+ .get_syntax(None, &mut opened_input, &self.syntax_mapping)
314+ .unwrap_or_else(|_| self.assets.syntax_set.find_syntax_plain_text())
315+ .name
316+ .clone()
307317 }
308318
309319 fn syntax_for_file_with_content_os(&self, file_name: &OsStr, first_line: &str) -> String {
@@ -312,11 +322,12 @@ mod tests {
312322 .with_name(Some(file_path.as_os_str()));
313323 let dummy_stdin: &[u8] = &[];
314324 let mut opened_input = input.open(dummy_stdin).unwrap();
315− let syntax = self
316− .assets
317− .get_syntax(None, &mut opened_input, &self.syntax_mapping);
318325
319− syntax.name.clone()
326+ self.assets
327+ .get_syntax(None, &mut opened_input, &self.syntax_mapping)
328+ .unwrap_or_else(|_| self.assets.syntax_set.find_syntax_plain_text())
329+ .name
330+ .clone()
320331 }
321332
322333 fn syntax_for_file_os(&self, file_name: &OsStr) -> String {
@@ -335,10 +346,11 @@ mod tests {
335346 let input = Input::stdin().with_name(Some(OsStr::new(file_name)));
336347 let mut opened_input = input.open(content).unwrap();
337348
338− let syntax = self
339− .assets
340− .get_syntax(None, &mut opened_input, &self.syntax_mapping);
341− syntax.name.clone()
349+ self.assets
350+ .get_syntax(None, &mut opened_input, &self.syntax_mapping)
351+ .unwrap_or_else(|_| self.assets.syntax_set.find_syntax_plain_text())
352+ .name
353+ .clone()
342354 }
343355
344356 fn syntax_is_same_for_inputkinds(&self, file_name: &str, content: &str) -> bool {
src/error.rs+11
@@ -10,6 +10,17 @@ error_chain! {
1010 GlobParsingError(::globset::Error);
1111 SerdeYamlError(::serde_yaml::Error);
1212 }
13+
14+ errors {
15+ UndetectedSyntax(input: String) {
16+ description("unable to detect syntax"),
17+ display("unable to detect syntax for {}", input)
18+ }
19+ UnknownSyntax(name: String) {
20+ description("unknown syntax"),
21+ display("unknown syntax: '{}'", name)
22+ }
23+ }
1324}
1425
1526pub fn default_error_handler(error: &Error, output: &mut dyn Write) {
src/printer.rs+4−1
@@ -164,7 +164,10 @@ impl<'a> InteractivePrinter<'a> {
164164 None
165165 } else {
166166 // Determine the type of syntax for highlighting
167− let syntax = assets.get_syntax(config.language, input, &config.syntax_mapping);
167+ let syntax = assets
168+ .get_syntax(config.language, input, &config.syntax_mapping)
169+ .unwrap_or_else(|_| assets.syntax_set.find_syntax_plain_text());
170+
168171 Some(HighlightLines::new(syntax, theme))
169172 };
170173