use colored::Colorize;
use std::fmt;
use crate::call;
use crate::from_c;
use crate::value::helpers;
use crate::value::kind::*;
use crate::TraceError;
use crate::{call::CStruct, VarOutType};
#[allow(non_camel_case_types)]
pub enum Value {
Int(isize),
UnsignedLong(usize),
SizeT(usize),
SSizeT(isize),
OffT(usize),
CString(String),
Buffer(Vec<u8>),
MemoryAddress(MemoryAddress),
CStruct(CStruct),
Void,
None,
Skip,
Failure,
Error(TraceError),
ValueNotImplemented,
AddressFamily(call::AddressFamily),
C_stat(from_c::stat),
SockAddr(call::SockAddr),
SocketType(call::SocketType),
OpenatMode(call::OpenatMode),
AccessMode(call::AccessMode),
Prot(call::Prot),
DynType(Box<dyn VarOutType>),
}
impl fmt::Debug for Value {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Value::Int(v) => write!(f, "{}", v),
Value::UnsignedLong(v) => write!(f, "{}", v),
Value::SizeT(v) => write!(f, "{}", v),
Value::SSizeT(v) => write!(f, "{}", v),
Value::OffT(v) => write!(f, "{}", v),
Value::CString(v) => write!(f, "{:?}", v),
Value::Buffer(v) => write!(f, "{}", helpers::format_buf(v, v.len() as i64, 32)),
Value::MemoryAddress(v) => write!(f, "{:?}", v),
Value::CStruct(cs) => write!(f, "{:?}", cs),
Value::Void => write!(f, "void"),
Value::None => write!(f, "None"),
Value::Skip => write!(f, "?"),
Value::Failure => write!(f, "{}", format!("FAIL").red()),
Value::Error(e) => write!(f, "{}: {:?}", format!("FAIL").red(), e),
Value::ValueNotImplemented => {
write!(f, "{}", format!("https://git.io/Jv49L").magenta().dimmed())
}
Value::AddressFamily(v) => write!(f, "{:?}", v),
Value::C_stat(v) => write!(f, "{:?}", v),
Value::SockAddr(v) => write!(f, "{:?}", v),
Value::SocketType(v) => write!(f, "{:?}", v),
Value::OpenatMode(v) => write!(f, "{:?}", v),
Value::AccessMode(v) => write!(f, "{:?}", v),
Value::Prot(v) => write!(f, "{:?}", v),
Value::DynType(_) => write!(f, "dyn VarOutType"),
}
}
}