pub mod symlink;
use libmagic_rs::LibmagicError;
use std::io::Write;
use std::path::Path;
pub enum FileOutcome {
Classified,
ClassifiedUnreadable(LibmagicError),
}
pub fn stdout_is_terminal() -> bool {
static IS_TERMINAL: std::sync::OnceLock<bool> = std::sync::OnceLock::new();
*IS_TERMINAL.get_or_init(|| std::io::IsTerminal::is_terminal(&std::io::stdout()))
}
pub fn synthetic_result(description: &str) -> libmagic_rs::EvaluationResult {
let rule_match = libmagic_rs::RuleMatch::new(
description.to_string(),
0,
0,
libmagic_rs::Value::Bytes(Vec::new()),
libmagic_rs::TypeKind::String {
max_length: None,
flags: libmagic_rs::parser::ast::StringFlags::default(),
},
1.0,
);
libmagic_rs::EvaluationResult::new(
description.to_string(),
None,
1.0,
vec![rule_match],
libmagic_rs::EvaluationMetadata::new(0, 0.0, 0, None, false),
)
}
pub fn output_description_bytes(
writer: &mut impl Write,
file_path: &Path,
description: &[u8],
args: &crate::Args,
is_multiple_files: bool,
) -> Result<(), LibmagicError> {
match args.output_format() {
crate::OutputFormat::Text => {
write!(writer, "{}: ", file_path.display()).map_err(LibmagicError::IoError)?;
writer
.write_all(description)
.map_err(LibmagicError::IoError)?;
writeln!(writer).map_err(LibmagicError::IoError)?;
Ok(())
}
crate::OutputFormat::Json => {
let result = synthetic_result(&String::from_utf8_lossy(description));
crate::output_result(writer, file_path, &result, args, is_multiple_files)
}
}
}