use rlp::{Encodable, Decodable, DecoderError, RlpStream, Rlp};
#[derive(Debug, PartialEq, Clone)]
pub enum ActionType {
Create,
Call,
CallCode,
DelegateCall,
StaticCall,
Create2
}
impl Encodable for ActionType {
fn rlp_append(&self, s: &mut RlpStream) {
let v = match *self {
ActionType::Create => 0u32,
ActionType::Call => 1,
ActionType::CallCode => 2,
ActionType::DelegateCall => 3,
ActionType::StaticCall => 4,
ActionType::Create2 => 5,
};
Encodable::rlp_append(&v, s);
}
}
impl Decodable for ActionType {
fn decode(rlp: &Rlp) -> Result<Self, DecoderError> {
rlp.as_val().and_then(|v| Ok(match v {
0u32 => ActionType::Create,
1 => ActionType::Call,
2 => ActionType::CallCode,
3 => ActionType::DelegateCall,
4 => ActionType::StaticCall,
5 => ActionType::Create2,
_ => return Err(DecoderError::Custom("Invalid value of ActionType item")),
}))
}
}
#[cfg(test)]
mod tests {
use rlp::*;
use super::ActionType;
#[test]
fn encode_call_type() {
let ct = ActionType::Call;
let mut s = RlpStream::new_list(2);
s.append(&ct);
assert!(!s.is_finished(), "List shouldn't finished yet");
s.append(&ct);
assert!(s.is_finished(), "List should be finished now");
s.out();
}
#[test]
fn should_encode_and_decode_call_type() {
let original = ActionType::Call;
let encoded = encode(&original);
let decoded = decode(&encoded).expect("failure decoding ActionType");
assert_eq!(original, decoded);
}
}