use super::{DictMap, ErrorCategory, VmDictExt, VmError, VmValue};
pub fn io_error_kind_str(error: &std::io::Error) -> &'static str {
use std::io::ErrorKind;
match error.kind() {
ErrorKind::NotFound => "not_found",
ErrorKind::PermissionDenied => "permission_denied",
ErrorKind::AlreadyExists => "already_exists",
ErrorKind::StorageFull => "storage_full",
ErrorKind::QuotaExceeded => "quota_exceeded",
ErrorKind::FileTooLarge => "file_too_large",
ErrorKind::ReadOnlyFilesystem => "read_only_filesystem",
ErrorKind::NotADirectory => "not_a_directory",
ErrorKind::IsADirectory => "is_a_directory",
ErrorKind::DirectoryNotEmpty => "directory_not_empty",
ErrorKind::CrossesDevices => "crosses_devices",
ErrorKind::TooManyLinks => "too_many_links",
ErrorKind::InvalidInput => "invalid_input",
ErrorKind::InvalidData => "invalid_data",
ErrorKind::TimedOut => "timed_out",
ErrorKind::Interrupted => "interrupted",
ErrorKind::UnexpectedEof => "unexpected_eof",
ErrorKind::WouldBlock => "would_block",
ErrorKind::OutOfMemory => "out_of_memory",
ErrorKind::ResourceBusy => "resource_busy",
ErrorKind::ExecutableFileBusy => "executable_file_busy",
_ => "other",
}
}
pub fn io_error_value(
error: &std::io::Error,
message: impl AsRef<str>,
category: Option<ErrorCategory>,
) -> VmValue {
let mut failure = DictMap::new();
failure.put_str("error", "io_error");
failure.put_str("kind", io_error_kind_str(error));
failure.put_str("message", message);
if let Some(category) = category {
failure.put_str("category", category.as_str());
}
VmValue::dict(failure)
}
pub fn io_error_thrown(
error: &std::io::Error,
message: impl AsRef<str>,
category: Option<ErrorCategory>,
) -> VmError {
VmError::Thrown(io_error_value(error, message, category))
}
pub fn environment_io_error_thrown(error: &std::io::Error, message: impl AsRef<str>) -> VmError {
io_error_thrown(error, message, Some(ErrorCategory::Environment))
}