use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Debug, Deserialize, PartialEq, Eq, Serialize)]
pub enum Role {
Guest = 0,
User = 1,
AuthUser = 2,
Admin = 3,
Root = 4,
}
impl From<i16> for Role {
fn from(value: i16) -> Self {
match value {
1 => Role::User,
2 => Role::AuthUser,
3 => Role::Admin,
4 => Role::Root,
_ => Role::Guest,
}
}
}
impl From<Role> for i16 {
fn from(value: Role) -> Self {
match value {
Role::User => 1,
Role::AuthUser => 2,
Role::Admin => 3,
Role::Root => 4,
_ => 0,
}
}
}
impl From<u16> for Role {
fn from(value: u16) -> Self {
match value {
1 => Role::User,
2 => Role::AuthUser,
3 => Role::Admin,
4 => Role::Root,
_ => Role::Guest,
}
}
}
impl From<Role> for u16 {
fn from(value: Role) -> Self {
match value {
Role::User => 1,
Role::AuthUser => 2,
Role::Admin => 3,
Role::Root => 4,
_ => 0,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use serde_with::{serde_as, FromInto};
#[test]
fn test_serde() {
const OUT: &str = r#"{"bar":42,"baz":"whatever","role":2}"#;
#[serde_as]
#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq)]
struct Foo<'a> {
bar: i32,
baz: &'a str,
#[serde_as(as = "FromInto<u16>")]
role: Role,
}
let x = Foo {
bar: 42,
baz: "whatever",
role: Role::AuthUser,
};
let out = serde_json::to_string(&x).expect("Failed serializing Foo");
assert_eq!(out, OUT);
let foo: Foo = serde_json::from_str(&out).expect("Failed deserializing Foo");
assert_eq!(foo, x);
}
}