use crate::std::{Box, Vec};
#[derive(Debug, Clone, PartialEq)]
pub struct Param {
pub kind: ParamKind,
pub indexed: bool,
}
#[derive(Debug, Clone, PartialEq)]
pub enum ParamKind {
Address,
Bytes,
Int(usize),
Uint(usize),
Bool,
String,
Array(Box<ParamKind>),
FixedBytes(usize),
FixedArray(Box<ParamKind>, usize),
Tuple(Vec<Box<ParamKind>>),
}
impl ParamKind {
pub fn is_empty_bytes_valid_encoding(&self) -> bool {
match self {
ParamKind::FixedBytes(len) => *len == 0,
ParamKind::FixedArray(_, len) => *len == 0,
_ => false,
}
}
pub fn is_dynamic(&self) -> bool {
match self {
ParamKind::Bytes | ParamKind::String | ParamKind::Array(_) => true,
ParamKind::FixedArray(elem_type, _) => elem_type.is_dynamic(),
ParamKind::Tuple(params) => params.iter().any(|param| param.is_dynamic()),
_ => false,
}
}
}
#[cfg(test)]
mod tests {
use crate::ParamKind;
#[test]
fn test_is_dynamic() {
assert_eq!(ParamKind::Address.is_dynamic(), false);
assert_eq!(ParamKind::Bytes.is_dynamic(), true);
assert_eq!(ParamKind::FixedBytes(32).is_dynamic(), false);
assert_eq!(ParamKind::Uint(256).is_dynamic(), false);
assert_eq!(ParamKind::Int(64).is_dynamic(), false);
assert_eq!(ParamKind::Bool.is_dynamic(), false);
assert_eq!(ParamKind::String.is_dynamic(), true);
assert_eq!(ParamKind::Array(Box::new(ParamKind::Bool)).is_dynamic(), true);
assert_eq!(ParamKind::FixedArray(Box::new(ParamKind::Uint(256)), 2).is_dynamic(), false);
assert_eq!(ParamKind::FixedArray(Box::new(ParamKind::String), 2).is_dynamic(), true);
assert_eq!(ParamKind::FixedArray(Box::new(ParamKind::Array(Box::new(ParamKind::Bool))), 2).is_dynamic(), true);
}
}