mirror of
				https://github.com/astral-sh/ruff.git
				synced 2025-10-31 12:05:57 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			33 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			33 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use colored::Colorize;
 | |
| use std::io;
 | |
| use ty::{ExitStatus, run};
 | |
| 
 | |
| pub fn main() -> ExitStatus {
 | |
|     run().unwrap_or_else(|error| {
 | |
|         use io::Write;
 | |
| 
 | |
|         // Use `writeln` instead of `eprintln` to avoid panicking when the stderr pipe is broken.
 | |
|         let mut stderr = io::stderr().lock();
 | |
| 
 | |
|         // This communicates that this isn't a linter error but ty itself hard-errored for
 | |
|         // some reason (e.g. failed to resolve the configuration)
 | |
|         writeln!(stderr, "{}", "ty failed".red().bold()).ok();
 | |
|         // Currently we generally only see one error, but e.g. with io errors when resolving
 | |
|         // the configuration it is help to chain errors ("resolving configuration failed" ->
 | |
|         // "failed to read file: subdir/pyproject.toml")
 | |
|         for cause in error.chain() {
 | |
|             // Exit "gracefully" on broken pipe errors.
 | |
|             //
 | |
|             // See: https://github.com/BurntSushi/ripgrep/blob/bf63fe8f258afc09bae6caa48f0ae35eaf115005/crates/core/main.rs#L47C1-L61C14
 | |
|             if let Some(ioerr) = cause.downcast_ref::<io::Error>() {
 | |
|                 if ioerr.kind() == io::ErrorKind::BrokenPipe {
 | |
|                     return ExitStatus::Success;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             writeln!(stderr, "  {} {cause}", "Cause:".bold()).ok();
 | |
|         }
 | |
| 
 | |
|         ExitStatus::Error
 | |
|     })
 | |
| }
 | 
