use super::*;
impl StackItem {
pub fn to_bytes(&self) -> Vec<u8> {
match self {
StackItem::Integer(i) => i.to_le_bytes().to_vec(),
StackItem::UnsignedInteger(u) => u.to_le_bytes().to_vec(),
StackItem::ByteArray(bytes) => bytes.borrow().clone(),
StackItem::Array(_) | StackItem::Map(_) => serde_json::to_vec(self).unwrap_or_default(),
StackItem::Boolean(b) => vec![if *b { 1 } else { 0 }],
StackItem::Null => vec![0],
}
}
pub fn from_bytes(bytes: &[u8]) -> Self {
if bytes.is_empty() {
return StackItem::Null;
}
if bytes.len() == 8 {
if let Ok(array) = bytes.try_into() {
return StackItem::UnsignedInteger(u64::from_le_bytes(array));
}
}
StackItem::byte_array(bytes.to_vec())
}
pub fn is_truthy(&self) -> bool {
match self {
StackItem::Integer(i) => *i != 0,
StackItem::UnsignedInteger(u) => *u != 0,
StackItem::ByteArray(bytes) => {
let bytes = bytes.borrow();
!bytes.is_empty() && bytes.iter().any(|&b| b != 0)
}
StackItem::Array(items) => !items.borrow().is_empty(),
StackItem::Map(map) => !map.borrow().is_empty(),
StackItem::Boolean(b) => *b,
StackItem::Null => false,
}
}
}