use num_derive::{FromPrimitive, ToPrimitive};
#[repr(u64)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, FromPrimitive, ToPrimitive)]
pub enum KeyspaceTag {
State = 0,
Context = 1,
NamedKey = 2,
PaymentInfo = 3,
}
#[repr(u64)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Keyspace<'a> {
State,
Context(&'a [u8]),
NamedKey(&'a str),
PaymentInfo(&'a str),
}
impl Keyspace<'_> {
#[must_use]
pub fn as_tag(&self) -> KeyspaceTag {
match self {
Keyspace::State => KeyspaceTag::State,
Keyspace::Context(_) => KeyspaceTag::Context,
Keyspace::NamedKey(_) => KeyspaceTag::NamedKey,
Keyspace::PaymentInfo(_) => KeyspaceTag::PaymentInfo,
}
}
#[must_use]
pub fn as_u64(&self) -> u64 {
self.as_tag() as u64
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_as_tag_state() {
let keyspace = Keyspace::State;
assert_eq!(keyspace.as_tag(), KeyspaceTag::State);
}
#[test]
fn test_as_tag_context() {
let data = [1, 2, 3];
let keyspace = Keyspace::Context(&data);
assert_eq!(keyspace.as_tag(), KeyspaceTag::Context);
}
#[test]
fn test_as_tag_named_key() {
let name = "my_key";
let keyspace = Keyspace::NamedKey(name);
assert_eq!(keyspace.as_tag(), KeyspaceTag::NamedKey);
}
#[test]
fn test_as_u64_state() {
let keyspace = Keyspace::State;
assert_eq!(keyspace.as_u64(), 0);
}
#[test]
fn test_as_u64_context() {
let data = [1, 2, 3];
let keyspace = Keyspace::Context(&data);
assert_eq!(keyspace.as_u64(), 1);
}
#[test]
fn test_as_u64_named_key() {
let name = "my_key";
let keyspace = Keyspace::NamedKey(name);
assert_eq!(keyspace.as_u64(), 2);
}
#[test]
fn test_as_u64_payment_info() {
let name = "entry_point";
let keyspace: Keyspace = Keyspace::PaymentInfo(name);
assert_eq!(keyspace.as_u64(), 3);
}
}