use std::path::PathBuf;
use thiserror::Error;
#[derive(Error, Debug)]
pub enum ProbeError {
#[error("File not found: {path}")]
FileNotFound {
path: PathBuf,
},
#[error("Cannot open file: {path} - {reason}")]
CannotOpen {
path: PathBuf,
reason: String,
},
#[error("Invalid media file: {path} - {reason}")]
InvalidMedia {
path: PathBuf,
reason: String,
},
#[error("No streams found in file: {path}")]
NoStreams {
path: PathBuf,
},
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
#[error("ffmpeg error: {message} (code={code})")]
Ffmpeg {
code: i32,
message: String,
},
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_file_not_found_error() {
let err = ProbeError::FileNotFound {
path: PathBuf::from("/path/to/missing.mp4"),
};
let msg = err.to_string();
assert!(msg.contains("File not found"));
assert!(msg.contains("missing.mp4"));
}
#[test]
fn test_cannot_open_error() {
let err = ProbeError::CannotOpen {
path: PathBuf::from("/path/to/file.mp4"),
reason: "permission denied".to_string(),
};
let msg = err.to_string();
assert!(msg.contains("Cannot open file"));
assert!(msg.contains("permission denied"));
}
#[test]
fn test_invalid_media_error() {
let err = ProbeError::InvalidMedia {
path: PathBuf::from("/path/to/bad.mp4"),
reason: "corrupted header".to_string(),
};
let msg = err.to_string();
assert!(msg.contains("Invalid media file"));
assert!(msg.contains("corrupted header"));
}
#[test]
fn test_no_streams_error() {
let err = ProbeError::NoStreams {
path: PathBuf::from("/path/to/empty.mp4"),
};
let msg = err.to_string();
assert!(msg.contains("No streams found"));
}
#[test]
fn ffmpeg_should_display_code_and_message() {
let err = ProbeError::Ffmpeg {
code: -2,
message: "codec not found".to_string(),
};
let msg = err.to_string();
assert!(msg.contains("ffmpeg error"));
assert!(msg.contains("codec not found"));
assert!(msg.contains("code=-2"));
}
#[test]
fn test_io_error_conversion() {
let io_err = std::io::Error::new(std::io::ErrorKind::NotFound, "file not found");
let err: ProbeError = io_err.into();
assert!(matches!(err, ProbeError::Io(_)));
}
}