Skip to content

Commit 03fd9cd

Browse files
aw-models: Add custom schema for tryparse
1 parent 96cbc9d commit 03fd9cd

File tree

1 file changed

+23
-15
lines changed

1 file changed

+23
-15
lines changed

aw-models/src/tryvec.rs

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use schemars::JsonSchema;
1+
use schemars::{gen::SchemaGenerator, schema::Schema, JsonSchema};
22
use serde::de::{DeserializeOwned, SeqAccess, Visitor};
33
use serde::export::PhantomData;
44
use serde::ser::SerializeSeq;
@@ -7,17 +7,24 @@ use serde_json::Value;
77
use std::fmt;
88
use 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>
6471
where
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

94101
impl<'de, T> Visitor<'de> for TryVecVisitor<T>
95102
where
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>
133140
where
134141
T: DeserializeOwned,
135142
{
@@ -143,11 +150,12 @@ where
143150

144151
#[cfg(test)]
145152
mod 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

Comments
 (0)