mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-10-15 09:45:06 +02:00
99 lines
2.3 KiB
Rust
99 lines
2.3 KiB
Rust
use serde_plain::{
|
|
derive_deserialize_from_fromstr, derive_display_from_serialize,
|
|
derive_fromstr_from_deserialize, derive_serialize_from_display,
|
|
};
|
|
use std::{fmt, num, str};
|
|
|
|
#[macro_use]
|
|
extern crate serde_derive;
|
|
|
|
#[derive(Serialize, Deserialize, Eq, PartialEq, Debug)]
|
|
#[serde(rename_all = "snake_case")]
|
|
pub enum Test {
|
|
FooBarBaz,
|
|
BlahBlah,
|
|
}
|
|
|
|
#[derive(Serialize, Deserialize, Eq, PartialEq, Debug)]
|
|
pub enum Test2 {
|
|
FooBarBaz,
|
|
BlahBlah,
|
|
}
|
|
|
|
#[derive(Debug, PartialEq, Eq)]
|
|
pub struct Test2Error;
|
|
|
|
impl From<serde_plain::Error> for Test2Error {
|
|
fn from(_: serde_plain::Error) -> Test2Error {
|
|
Test2Error
|
|
}
|
|
}
|
|
|
|
#[derive(Serialize, Deserialize, Eq, PartialEq, Debug)]
|
|
pub enum Test3 {
|
|
FooBarBaz,
|
|
BlahBlah,
|
|
}
|
|
|
|
#[derive(Debug, PartialEq, Eq)]
|
|
pub struct Test3Error(String);
|
|
|
|
pub struct TestStruct(u32);
|
|
|
|
impl str::FromStr for TestStruct {
|
|
type Err = num::ParseIntError;
|
|
fn from_str(value: &str) -> Result<TestStruct, Self::Err> {
|
|
Ok(TestStruct(value.parse()?))
|
|
}
|
|
}
|
|
|
|
impl fmt::Display for TestStruct {
|
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
write!(f, "{}", self.0)
|
|
}
|
|
}
|
|
|
|
derive_fromstr_from_deserialize!(Test);
|
|
derive_display_from_serialize!(Test);
|
|
|
|
derive_fromstr_from_deserialize!(Test2, Test2Error);
|
|
derive_display_from_serialize!(Test2);
|
|
|
|
derive_fromstr_from_deserialize!(Test3, |err| -> Test3Error { Test3Error(err.to_string()) });
|
|
derive_display_from_serialize!(Test3);
|
|
|
|
derive_deserialize_from_fromstr!(TestStruct, "valid positive number");
|
|
derive_serialize_from_display!(TestStruct);
|
|
|
|
#[test]
|
|
fn test_forward_basics() {
|
|
assert_eq!(Test::FooBarBaz.to_string(), "foo_bar_baz");
|
|
assert_eq!("foo_bar_baz".parse::<Test>().unwrap(), Test::FooBarBaz);
|
|
}
|
|
|
|
#[test]
|
|
fn test_forward_custom_error() {
|
|
assert_eq!("whatever".parse::<Test2>(), Err(Test2Error));
|
|
}
|
|
|
|
#[test]
|
|
fn test_forward_custom_error_conversion() {
|
|
assert_eq!(
|
|
"whatever".parse::<Test3>(),
|
|
Err(Test3Error(
|
|
"unknown variant `whatever`, expected `FooBarBaz` or `BlahBlah`".to_string()
|
|
))
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn test_derive_deserialize() {
|
|
let test: TestStruct = serde_plain::from_str("42").unwrap();
|
|
assert_eq!(TestStruct(42).0, test.0);
|
|
}
|
|
|
|
#[test]
|
|
fn test_derive_serialize() {
|
|
let test = serde_plain::to_string(&TestStruct(42)).unwrap();
|
|
assert_eq!("42", test.as_str());
|
|
}
|