mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-04-22 19:28:01 +00:00
Merge pull request 1526 from fanzeyi/try_from
This commit is contained in:
@@ -5,6 +5,7 @@ use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
||||
|
||||
use std::collections::{BTreeMap, HashMap};
|
||||
use std::fmt;
|
||||
use std::convert::TryFrom;
|
||||
use std::marker::PhantomData;
|
||||
|
||||
use serde_test::{
|
||||
@@ -1588,6 +1589,25 @@ impl From<Option<u32>> for EnumToU32 {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Deserialize, PartialEq, Debug)]
|
||||
#[serde(try_from = "EnumToU32")]
|
||||
struct StructTryFromEnum(Option<u32>);
|
||||
|
||||
impl TryFrom<EnumToU32> for StructTryFromEnum {
|
||||
type Error = String;
|
||||
|
||||
fn try_from(value: EnumToU32) -> Result<Self, Self::Error> {
|
||||
println!("{:?}", value);
|
||||
match value {
|
||||
EnumToU32::One => Ok(StructTryFromEnum(Some(1))),
|
||||
EnumToU32::Two => Ok(StructTryFromEnum(Some(2))),
|
||||
EnumToU32::Three => Ok(StructTryFromEnum(Some(3))),
|
||||
EnumToU32::Four => Ok(StructTryFromEnum(Some(4))),
|
||||
_ => Err("out of range".into()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_from_into_traits() {
|
||||
assert_ser_tokens::<EnumToU32>(&EnumToU32::One, &[Token::Some, Token::U32(1)]);
|
||||
@@ -1596,6 +1616,9 @@ fn test_from_into_traits() {
|
||||
assert_ser_tokens::<StructFromEnum>(&StructFromEnum(Some(5)), &[Token::None]);
|
||||
assert_ser_tokens::<StructFromEnum>(&StructFromEnum(None), &[Token::None]);
|
||||
assert_de_tokens::<StructFromEnum>(&StructFromEnum(Some(2)), &[Token::Some, Token::U32(2)]);
|
||||
assert_de_tokens::<StructTryFromEnum>(&StructTryFromEnum(Some(2)), &[Token::Some, Token::U32(2)]);
|
||||
assert_de_tokens_error::<StructTryFromEnum>(&[Token::Some, Token::U32(5)], "out of range");
|
||||
assert_de_tokens_error::<StructTryFromEnum>(&[Token::None], "out of range");
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
use serde_derive::Serialize;
|
||||
|
||||
#[derive(Serialize)]
|
||||
#[serde(from = "u64", try_from = "u64")]
|
||||
struct S {
|
||||
a: u8,
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
@@ -0,0 +1,8 @@
|
||||
error: #[serde(from = "...")] and #[serde(try_from = "...")] conflict with each other
|
||||
--> $DIR/from-try-from.rs:4:1
|
||||
|
|
||||
4 | / #[serde(from = "u64", try_from = "u64")]
|
||||
5 | | struct S {
|
||||
6 | | a: u8,
|
||||
7 | | }
|
||||
| |_^
|
||||
@@ -0,0 +1,9 @@
|
||||
use serde_derive::Serialize;
|
||||
|
||||
#[derive(Serialize)]
|
||||
#[serde(transparent, try_from = "u64")]
|
||||
struct S {
|
||||
a: u8,
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
@@ -0,0 +1,8 @@
|
||||
error: #[serde(transparent)] is not allowed with #[serde(try_from = "...")]
|
||||
--> $DIR/with_try_from.rs:4:1
|
||||
|
|
||||
4 | / #[serde(transparent, try_from = "u64")]
|
||||
5 | | struct S {
|
||||
6 | | a: u8,
|
||||
7 | | }
|
||||
| |_^
|
||||
@@ -0,0 +1,12 @@
|
||||
use serde_derive::Deserialize;
|
||||
|
||||
#[derive(Deserialize)]
|
||||
#[serde(try_from = "Option<T")]
|
||||
enum TestOne {
|
||||
Testing,
|
||||
One,
|
||||
Two,
|
||||
Three,
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
@@ -0,0 +1,5 @@
|
||||
error: failed to parse type: try_from = "Option<T"
|
||||
--> $DIR/try_from.rs:4:20
|
||||
|
|
||||
4 | #[serde(try_from = "Option<T")]
|
||||
| ^^^^^^^^^^
|
||||
Reference in New Issue
Block a user