Do not serialize schema default if it would be skipped by skip_serializing_if
attribute
This commit is contained in:
parent
8301a38b8f
commit
26c4099bbe
6 changed files with 42 additions and 42 deletions
|
@ -103,7 +103,11 @@ pub struct SchemaObject {
|
||||||
/// The `const` keyword.
|
/// The `const` keyword.
|
||||||
///
|
///
|
||||||
/// See [JSON Schema Validation 6.1.3. "const"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.1.3)
|
/// See [JSON Schema Validation 6.1.3. "const"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.1.3)
|
||||||
#[serde(rename = "const", skip_serializing_if = "Option::is_none")]
|
#[serde(
|
||||||
|
rename = "const",
|
||||||
|
skip_serializing_if = "Option::is_none",
|
||||||
|
deserialize_with = "allow_null"
|
||||||
|
)]
|
||||||
pub const_value: Option<Value>,
|
pub const_value: Option<Value>,
|
||||||
/// Properties of the [`SchemaObject`] which define validation assertions in terms of other schemas.
|
/// Properties of the [`SchemaObject`] which define validation assertions in terms of other schemas.
|
||||||
#[serde(flatten, deserialize_with = "skip_if_default")]
|
#[serde(flatten, deserialize_with = "skip_if_default")]
|
||||||
|
@ -130,6 +134,15 @@ pub struct SchemaObject {
|
||||||
pub extensions: Map<String, Value>,
|
pub extensions: Map<String, Value>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Deserializing "null" to `Option<Value>` directly results in `None`,
|
||||||
|
// this function instead makes it deserialize to `Some(Value::Null)`.
|
||||||
|
fn allow_null<'de, D>(de: D) -> Result<Option<Value>, D::Error>
|
||||||
|
where
|
||||||
|
D: serde::Deserializer<'de>,
|
||||||
|
{
|
||||||
|
Value::deserialize(de).map(Option::Some)
|
||||||
|
}
|
||||||
|
|
||||||
fn skip_if_default<'de, D, T>(deserializer: D) -> Result<Option<Box<T>>, D::Error>
|
fn skip_if_default<'de, D, T>(deserializer: D) -> Result<Option<Box<T>>, D::Error>
|
||||||
where
|
where
|
||||||
D: serde::Deserializer<'de>,
|
D: serde::Deserializer<'de>,
|
||||||
|
@ -226,7 +239,10 @@ pub struct Metadata {
|
||||||
/// The `default` keyword.
|
/// The `default` keyword.
|
||||||
///
|
///
|
||||||
/// See [JSON Schema Validation 9.2. "default"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.2).
|
/// See [JSON Schema Validation 9.2. "default"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.2).
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(
|
||||||
|
skip_serializing_if = "Option::is_none",
|
||||||
|
deserialize_with = "allow_null"
|
||||||
|
)]
|
||||||
pub default: Option<Value>,
|
pub default: Option<Value>,
|
||||||
/// The `deprecated` keyword.
|
/// The `deprecated` keyword.
|
||||||
///
|
///
|
||||||
|
|
|
@ -72,7 +72,6 @@
|
||||||
},
|
},
|
||||||
"definitions": {
|
"definitions": {
|
||||||
"description": "The `$defs` keyword.\n\nThis is currently serialized as `definitions` for backwards compatibility.\n\nSee [JSON Schema 8.2.5. Schema Re-Use With \"$defs\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-8.2.5).",
|
"description": "The `$defs` keyword.\n\nThis is currently serialized as `definitions` for backwards compatibility.\n\nSee [JSON Schema 8.2.5. Schema Re-Use With \"$defs\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-8.2.5).",
|
||||||
"default": {},
|
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": {
|
"additionalProperties": {
|
||||||
"$ref": "#/components/schemas/Schema"
|
"$ref": "#/components/schemas/Schema"
|
||||||
|
@ -80,7 +79,6 @@
|
||||||
},
|
},
|
||||||
"deprecated": {
|
"deprecated": {
|
||||||
"description": "The `deprecated` keyword.\n\nSee [JSON Schema Validation 9.3. \"deprecated\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.3).",
|
"description": "The `deprecated` keyword.\n\nSee [JSON Schema Validation 9.3. \"deprecated\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.3).",
|
||||||
"default": false,
|
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
},
|
},
|
||||||
"description": {
|
"description": {
|
||||||
|
@ -222,7 +220,6 @@
|
||||||
},
|
},
|
||||||
"patternProperties": {
|
"patternProperties": {
|
||||||
"description": "The `patternProperties` keyword.\n\nSee [JSON Schema 9.3.2.2. \"patternProperties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.2).",
|
"description": "The `patternProperties` keyword.\n\nSee [JSON Schema 9.3.2.2. \"patternProperties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.2).",
|
||||||
"default": {},
|
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": {
|
"additionalProperties": {
|
||||||
"$ref": "#/components/schemas/Schema"
|
"$ref": "#/components/schemas/Schema"
|
||||||
|
@ -230,7 +227,6 @@
|
||||||
},
|
},
|
||||||
"properties": {
|
"properties": {
|
||||||
"description": "The `properties` keyword.\n\nSee [JSON Schema 9.3.2.1. \"properties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.1).",
|
"description": "The `properties` keyword.\n\nSee [JSON Schema 9.3.2.1. \"properties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.1).",
|
||||||
"default": {},
|
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": {
|
"additionalProperties": {
|
||||||
"$ref": "#/components/schemas/Schema"
|
"$ref": "#/components/schemas/Schema"
|
||||||
|
@ -247,12 +243,10 @@
|
||||||
},
|
},
|
||||||
"readOnly": {
|
"readOnly": {
|
||||||
"description": "The `readOnly` keyword.\n\nSee [JSON Schema Validation 9.4. \"readOnly\" and \"writeOnly\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.4).",
|
"description": "The `readOnly` keyword.\n\nSee [JSON Schema Validation 9.4. \"readOnly\" and \"writeOnly\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.4).",
|
||||||
"default": false,
|
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
},
|
},
|
||||||
"required": {
|
"required": {
|
||||||
"description": "The `required` keyword.\n\nSee [JSON Schema Validation 6.5.3. \"required\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.5.3).",
|
"description": "The `required` keyword.\n\nSee [JSON Schema Validation 6.5.3. \"required\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.5.3).",
|
||||||
"default": [],
|
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
|
@ -288,7 +282,6 @@
|
||||||
},
|
},
|
||||||
"writeOnly": {
|
"writeOnly": {
|
||||||
"description": "The `writeOnly` keyword.\n\nSee [JSON Schema Validation 9.4. \"readOnly\" and \"writeOnly\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.4).",
|
"description": "The `writeOnly` keyword.\n\nSee [JSON Schema Validation 9.4. \"readOnly\" and \"writeOnly\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.4).",
|
||||||
"default": false,
|
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -390,7 +383,6 @@
|
||||||
},
|
},
|
||||||
"deprecated": {
|
"deprecated": {
|
||||||
"description": "The `deprecated` keyword.\n\nSee [JSON Schema Validation 9.3. \"deprecated\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.3).",
|
"description": "The `deprecated` keyword.\n\nSee [JSON Schema Validation 9.3. \"deprecated\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.3).",
|
||||||
"default": false,
|
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
},
|
},
|
||||||
"description": {
|
"description": {
|
||||||
|
@ -532,7 +524,6 @@
|
||||||
},
|
},
|
||||||
"patternProperties": {
|
"patternProperties": {
|
||||||
"description": "The `patternProperties` keyword.\n\nSee [JSON Schema 9.3.2.2. \"patternProperties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.2).",
|
"description": "The `patternProperties` keyword.\n\nSee [JSON Schema 9.3.2.2. \"patternProperties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.2).",
|
||||||
"default": {},
|
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": {
|
"additionalProperties": {
|
||||||
"$ref": "#/components/schemas/Schema"
|
"$ref": "#/components/schemas/Schema"
|
||||||
|
@ -540,7 +531,6 @@
|
||||||
},
|
},
|
||||||
"properties": {
|
"properties": {
|
||||||
"description": "The `properties` keyword.\n\nSee [JSON Schema 9.3.2.1. \"properties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.1).",
|
"description": "The `properties` keyword.\n\nSee [JSON Schema 9.3.2.1. \"properties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.1).",
|
||||||
"default": {},
|
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": {
|
"additionalProperties": {
|
||||||
"$ref": "#/components/schemas/Schema"
|
"$ref": "#/components/schemas/Schema"
|
||||||
|
@ -557,12 +547,10 @@
|
||||||
},
|
},
|
||||||
"readOnly": {
|
"readOnly": {
|
||||||
"description": "The `readOnly` keyword.\n\nSee [JSON Schema Validation 9.4. \"readOnly\" and \"writeOnly\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.4).",
|
"description": "The `readOnly` keyword.\n\nSee [JSON Schema Validation 9.4. \"readOnly\" and \"writeOnly\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.4).",
|
||||||
"default": false,
|
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
},
|
},
|
||||||
"required": {
|
"required": {
|
||||||
"description": "The `required` keyword.\n\nSee [JSON Schema Validation 6.5.3. \"required\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.5.3).",
|
"description": "The `required` keyword.\n\nSee [JSON Schema Validation 6.5.3. \"required\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.5.3).",
|
||||||
"default": [],
|
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
|
@ -598,7 +586,6 @@
|
||||||
},
|
},
|
||||||
"writeOnly": {
|
"writeOnly": {
|
||||||
"description": "The `writeOnly` keyword.\n\nSee [JSON Schema Validation 9.4. \"readOnly\" and \"writeOnly\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.4).",
|
"description": "The `writeOnly` keyword.\n\nSee [JSON Schema Validation 9.4. \"readOnly\" and \"writeOnly\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.4).",
|
||||||
"default": false,
|
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -86,7 +86,6 @@
|
||||||
},
|
},
|
||||||
"definitions": {
|
"definitions": {
|
||||||
"description": "The `$defs` keyword.\n\nThis is currently serialized as `definitions` for backwards compatibility.\n\nSee [JSON Schema 8.2.5. Schema Re-Use With \"$defs\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-8.2.5).",
|
"description": "The `$defs` keyword.\n\nThis is currently serialized as `definitions` for backwards compatibility.\n\nSee [JSON Schema 8.2.5. Schema Re-Use With \"$defs\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-8.2.5).",
|
||||||
"default": {},
|
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": {
|
"additionalProperties": {
|
||||||
"$ref": "#/definitions/Schema"
|
"$ref": "#/definitions/Schema"
|
||||||
|
@ -94,7 +93,6 @@
|
||||||
},
|
},
|
||||||
"deprecated": {
|
"deprecated": {
|
||||||
"description": "The `deprecated` keyword.\n\nSee [JSON Schema Validation 9.3. \"deprecated\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.3).",
|
"description": "The `deprecated` keyword.\n\nSee [JSON Schema Validation 9.3. \"deprecated\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.3).",
|
||||||
"default": false,
|
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
},
|
},
|
||||||
"description": {
|
"description": {
|
||||||
|
@ -276,7 +274,6 @@
|
||||||
},
|
},
|
||||||
"patternProperties": {
|
"patternProperties": {
|
||||||
"description": "The `patternProperties` keyword.\n\nSee [JSON Schema 9.3.2.2. \"patternProperties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.2).",
|
"description": "The `patternProperties` keyword.\n\nSee [JSON Schema 9.3.2.2. \"patternProperties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.2).",
|
||||||
"default": {},
|
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": {
|
"additionalProperties": {
|
||||||
"$ref": "#/definitions/Schema"
|
"$ref": "#/definitions/Schema"
|
||||||
|
@ -284,7 +281,6 @@
|
||||||
},
|
},
|
||||||
"properties": {
|
"properties": {
|
||||||
"description": "The `properties` keyword.\n\nSee [JSON Schema 9.3.2.1. \"properties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.1).",
|
"description": "The `properties` keyword.\n\nSee [JSON Schema 9.3.2.1. \"properties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.1).",
|
||||||
"default": {},
|
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": {
|
"additionalProperties": {
|
||||||
"$ref": "#/definitions/Schema"
|
"$ref": "#/definitions/Schema"
|
||||||
|
@ -303,12 +299,10 @@
|
||||||
},
|
},
|
||||||
"readOnly": {
|
"readOnly": {
|
||||||
"description": "The `readOnly` keyword.\n\nSee [JSON Schema Validation 9.4. \"readOnly\" and \"writeOnly\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.4).",
|
"description": "The `readOnly` keyword.\n\nSee [JSON Schema Validation 9.4. \"readOnly\" and \"writeOnly\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.4).",
|
||||||
"default": false,
|
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
},
|
},
|
||||||
"required": {
|
"required": {
|
||||||
"description": "The `required` keyword.\n\nSee [JSON Schema Validation 6.5.3. \"required\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.5.3).",
|
"description": "The `required` keyword.\n\nSee [JSON Schema Validation 6.5.3. \"required\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.5.3).",
|
||||||
"default": [],
|
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
|
@ -352,7 +346,6 @@
|
||||||
},
|
},
|
||||||
"writeOnly": {
|
"writeOnly": {
|
||||||
"description": "The `writeOnly` keyword.\n\nSee [JSON Schema Validation 9.4. \"readOnly\" and \"writeOnly\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.4).",
|
"description": "The `writeOnly` keyword.\n\nSee [JSON Schema Validation 9.4. \"readOnly\" and \"writeOnly\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.4).",
|
||||||
"default": false,
|
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -466,7 +459,6 @@
|
||||||
},
|
},
|
||||||
"deprecated": {
|
"deprecated": {
|
||||||
"description": "The `deprecated` keyword.\n\nSee [JSON Schema Validation 9.3. \"deprecated\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.3).",
|
"description": "The `deprecated` keyword.\n\nSee [JSON Schema Validation 9.3. \"deprecated\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.3).",
|
||||||
"default": false,
|
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
},
|
},
|
||||||
"description": {
|
"description": {
|
||||||
|
@ -648,7 +640,6 @@
|
||||||
},
|
},
|
||||||
"patternProperties": {
|
"patternProperties": {
|
||||||
"description": "The `patternProperties` keyword.\n\nSee [JSON Schema 9.3.2.2. \"patternProperties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.2).",
|
"description": "The `patternProperties` keyword.\n\nSee [JSON Schema 9.3.2.2. \"patternProperties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.2).",
|
||||||
"default": {},
|
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": {
|
"additionalProperties": {
|
||||||
"$ref": "#/definitions/Schema"
|
"$ref": "#/definitions/Schema"
|
||||||
|
@ -656,7 +647,6 @@
|
||||||
},
|
},
|
||||||
"properties": {
|
"properties": {
|
||||||
"description": "The `properties` keyword.\n\nSee [JSON Schema 9.3.2.1. \"properties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.1).",
|
"description": "The `properties` keyword.\n\nSee [JSON Schema 9.3.2.1. \"properties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.1).",
|
||||||
"default": {},
|
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": {
|
"additionalProperties": {
|
||||||
"$ref": "#/definitions/Schema"
|
"$ref": "#/definitions/Schema"
|
||||||
|
@ -675,12 +665,10 @@
|
||||||
},
|
},
|
||||||
"readOnly": {
|
"readOnly": {
|
||||||
"description": "The `readOnly` keyword.\n\nSee [JSON Schema Validation 9.4. \"readOnly\" and \"writeOnly\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.4).",
|
"description": "The `readOnly` keyword.\n\nSee [JSON Schema Validation 9.4. \"readOnly\" and \"writeOnly\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.4).",
|
||||||
"default": false,
|
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
},
|
},
|
||||||
"required": {
|
"required": {
|
||||||
"description": "The `required` keyword.\n\nSee [JSON Schema Validation 6.5.3. \"required\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.5.3).",
|
"description": "The `required` keyword.\n\nSee [JSON Schema Validation 6.5.3. \"required\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.5.3).",
|
||||||
"default": [],
|
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
|
@ -724,7 +712,6 @@
|
||||||
},
|
},
|
||||||
"writeOnly": {
|
"writeOnly": {
|
||||||
"description": "The `writeOnly` keyword.\n\nSee [JSON Schema Validation 9.4. \"readOnly\" and \"writeOnly\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.4).",
|
"description": "The `writeOnly` keyword.\n\nSee [JSON Schema Validation 9.4. \"readOnly\" and \"writeOnly\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.4).",
|
||||||
"default": false,
|
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -294,7 +294,9 @@ fn schema_for_struct(fields: &[Field], cattrs: &attr::Container) -> TokenStream
|
||||||
let ty = field.ty;
|
let ty = field.ty;
|
||||||
|
|
||||||
let default = match field.attrs.default() {
|
let default = match field.attrs.default() {
|
||||||
SerdeDefault::None if set_container_default.is_some() => {
|
_ if field.attrs.skip_serializing() => None,
|
||||||
|
SerdeDefault::None if set_container_default.is_none() => None,
|
||||||
|
SerdeDefault::None => {
|
||||||
let field_ident = field
|
let field_ident = field
|
||||||
.original
|
.original
|
||||||
.ident
|
.ident
|
||||||
|
@ -302,7 +304,6 @@ fn schema_for_struct(fields: &[Field], cattrs: &attr::Container) -> TokenStream
|
||||||
.expect("This is not a tuple struct, so field should be named");
|
.expect("This is not a tuple struct, so field should be named");
|
||||||
Some(quote!(cdefault.#field_ident))
|
Some(quote!(cdefault.#field_ident))
|
||||||
}
|
}
|
||||||
SerdeDefault::None => None,
|
|
||||||
SerdeDefault::Default => Some(quote!(<#ty>::default())),
|
SerdeDefault::Default => Some(quote!(<#ty>::default())),
|
||||||
SerdeDefault::Path(path) => Some(quote!(#path())),
|
SerdeDefault::Path(path) => Some(quote!(#path())),
|
||||||
}
|
}
|
||||||
|
@ -341,6 +342,7 @@ fn schema_for_struct(fields: &[Field], cattrs: &attr::Container) -> TokenStream
|
||||||
read_only: field.attrs.skip_deserializing(),
|
read_only: field.attrs.skip_deserializing(),
|
||||||
write_only: field.attrs.skip_serializing(),
|
write_only: field.attrs.skip_serializing(),
|
||||||
default,
|
default,
|
||||||
|
skip_default_if: field.attrs.skip_serializing_if().cloned(),
|
||||||
..get_metadata_from_docs(&field.original.attrs)
|
..get_metadata_from_docs(&field.original.attrs)
|
||||||
};
|
};
|
||||||
let schema_expr = set_metadata_on_schema(schema_expr, &metadata);
|
let schema_expr = set_metadata_on_schema(schema_expr, &metadata);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use crate::doc_attrs;
|
use crate::doc_attrs;
|
||||||
use proc_macro2::TokenStream;
|
use proc_macro2::TokenStream;
|
||||||
use syn::Attribute;
|
use syn::{Attribute, ExprPath};
|
||||||
|
|
||||||
#[derive(Debug, Clone, Default)]
|
#[derive(Debug, Clone, Default)]
|
||||||
pub struct SchemaMetadata {
|
pub struct SchemaMetadata {
|
||||||
|
@ -9,6 +9,7 @@ pub struct SchemaMetadata {
|
||||||
pub read_only: bool,
|
pub read_only: bool,
|
||||||
pub write_only: bool,
|
pub write_only: bool,
|
||||||
pub default: Option<TokenStream>,
|
pub default: Option<TokenStream>,
|
||||||
|
pub skip_default_if: Option<ExprPath>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_metadata_on_schema_from_docs(
|
pub fn set_metadata_on_schema_from_docs(
|
||||||
|
@ -34,32 +35,38 @@ pub fn set_metadata_on_schema(schema_expr: TokenStream, metadata: &SchemaMetadat
|
||||||
if let Some(title) = &metadata.title {
|
if let Some(title) = &metadata.title {
|
||||||
setters.push(quote! {
|
setters.push(quote! {
|
||||||
metadata.title = Some(#title.to_owned());
|
metadata.title = Some(#title.to_owned());
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
if let Some(description) = &metadata.description {
|
if let Some(description) = &metadata.description {
|
||||||
setters.push(quote! {
|
setters.push(quote! {
|
||||||
metadata.description = Some(#description.to_owned());
|
metadata.description = Some(#description.to_owned());
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if metadata.read_only {
|
if metadata.read_only {
|
||||||
setters.push(quote! {
|
setters.push(quote! {
|
||||||
metadata.read_only = true;
|
metadata.read_only = true;
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
if metadata.write_only {
|
if metadata.write_only {
|
||||||
setters.push(quote! {
|
setters.push(quote! {
|
||||||
metadata.write_only = true;
|
metadata.write_only = true;
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(default) = &metadata.default {
|
match (&metadata.default, &metadata.skip_default_if) {
|
||||||
setters.push(quote! {
|
(Some(default), Some(skip_if)) => setters.push(quote! {
|
||||||
metadata.default = match serde_json::value::to_value(#default) {
|
{
|
||||||
Ok(serde_json::value::Value::Null) | Err(_) => None,
|
let default = #default;
|
||||||
Ok(d) => Some(d),
|
if !#skip_if(&default) {
|
||||||
};
|
metadata.default = serde_json::value::to_value(default).ok();
|
||||||
})
|
}
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
(Some(default), None) => setters.push(quote! {
|
||||||
|
metadata.default = serde_json::value::to_value(#default).ok();
|
||||||
|
}),
|
||||||
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
if setters.is_empty() {
|
if setters.is_empty() {
|
||||||
|
|
|
@ -18,6 +18,7 @@ static SERDE_KEYWORDS: &[&str] = &[
|
||||||
"alias",
|
"alias",
|
||||||
"skip",
|
"skip",
|
||||||
"skip_serializing",
|
"skip_serializing",
|
||||||
|
"skip_serializing_if",
|
||||||
"skip_deserializing",
|
"skip_deserializing",
|
||||||
"other",
|
"other",
|
||||||
"flatten",
|
"flatten",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue