1- use schemars:: JsonSchema ;
1+ use schemars:: { gen :: SchemaGenerator , schema :: Schema , JsonSchema } ;
22use serde:: de:: { DeserializeOwned , SeqAccess , Visitor } ;
33use serde:: export:: PhantomData ;
44use serde:: ser:: SerializeSeq ;
@@ -7,17 +7,24 @@ use serde_json::Value;
77use std:: fmt;
88use std:: fmt:: Debug ;
99
10- #[ derive( Debug , Clone , JsonSchema ) ]
11- #[ serde( untagged) ]
12- // TODO: JsonSchema is invalid, we should only allow "Parsed" value as the
13- // others will be dropped
14- pub enum TryParse < T > {
10+ #[ derive( Debug , Clone ) ]
11+ pub enum TryParse < T : JsonSchema > {
1512 Parsed ( T ) ,
1613 Unparsed ( Value ) ,
1714 NotPresent ,
1815}
1916
20- impl < ' de , T : DeserializeOwned > Deserialize < ' de > for TryParse < T > {
17+ impl < T : JsonSchema > JsonSchema for TryParse < T > {
18+ fn schema_name ( ) -> String {
19+ format ! ( "Try<{}>" , std:: any:: type_name:: <T >( ) )
20+ }
21+
22+ fn json_schema ( gen : & mut SchemaGenerator ) -> Schema {
23+ gen. subschema_for :: < T > ( )
24+ }
25+ }
26+
27+ impl < ' de , T : DeserializeOwned + JsonSchema > Deserialize < ' de > for TryParse < T > {
2128 fn deserialize < D : Deserializer < ' de > > ( deserializer : D ) -> Result < Self , D :: Error > {
2229 match Option :: < Value > :: deserialize ( deserializer) ? {
2330 None => Ok ( TryParse :: NotPresent ) ,
@@ -31,11 +38,11 @@ impl<'de, T: DeserializeOwned> Deserialize<'de> for TryParse<T> {
3138
3239#[ derive( Debug , Clone , JsonSchema ) ]
3340#[ serde( transparent) ]
34- pub struct TryVec < T > {
41+ pub struct TryVec < T : JsonSchema > {
3542 inner : Vec < TryParse < T > > ,
3643}
3744
38- impl < T > TryVec < T > {
45+ impl < T : JsonSchema > TryVec < T > {
3946 pub fn new ( mut vec : Vec < T > ) -> Self {
4047 let mut vec_marked: Vec < TryParse < T > > = Vec :: new ( ) ;
4148 for item in vec. drain ( ..) {
@@ -60,7 +67,7 @@ impl<T> TryVec<T> {
6067 }
6168}
6269
63- impl < T > Serialize for TryVec < T >
70+ impl < T : JsonSchema > Serialize for TryVec < T >
6471where
6572 T : Serialize ,
6673{
@@ -79,11 +86,11 @@ where
7986 }
8087}
8188
82- struct TryVecVisitor < T > {
89+ struct TryVecVisitor < T : JsonSchema > {
8390 marker : PhantomData < fn ( ) -> TryVec < T > > ,
8491}
8592
86- impl < T > TryVecVisitor < T > {
93+ impl < T : JsonSchema > TryVecVisitor < T > {
8794 fn new ( ) -> Self {
8895 TryVecVisitor {
8996 marker : PhantomData ,
@@ -93,7 +100,7 @@ impl<T> TryVecVisitor<T> {
93100
94101impl < ' de , T > Visitor < ' de > for TryVecVisitor < T >
95102where
96- T : DeserializeOwned ,
103+ T : DeserializeOwned + JsonSchema ,
97104{
98105 type Value = TryVec < T > ;
99106
@@ -129,7 +136,7 @@ where
129136 }
130137}
131138
132- impl < ' de , T > Deserialize < ' de > for TryVec < T >
139+ impl < ' de , T : JsonSchema > Deserialize < ' de > for TryVec < T >
133140where
134141 T : DeserializeOwned ,
135142{
@@ -143,11 +150,12 @@ where
143150
144151#[ cfg( test) ]
145152mod test {
153+ use schemars:: JsonSchema ;
146154 use serde:: { Deserialize , Serialize } ;
147155
148156 use super :: TryVec ;
149157
150- #[ derive( Deserialize , Serialize , Debug ) ]
158+ #[ derive( Deserialize , Serialize , JsonSchema , Debug ) ]
151159 struct TestEvent {
152160 data : String ,
153161 }
0 commit comments