Skip to content

Commit

Permalink
Fix deriving JsonSchema inside macro (#79)
Browse files Browse the repository at this point in the history
  • Loading branch information
GREsau authored Apr 5, 2021
1 parent dada858 commit 4d34001
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 21 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Changelog

## [0.8.3] - **In-dev**
### Fixed:
- Fix deriving JsonSchema on types defined inside macros (https://github.com/GREsau/schemars/issues/66 / https://github.com/GREsau/schemars/pull/79)

## [0.8.2] - 2021-03-27
### Added:
- Enable generating a schema from any serializable value using `schema_for_value!(...)` macro or `SchemaGenerator::root_schema_for_value()`/`SchemaGenerator::into_root_schema_for_value()` methods (https://github.com/GREsau/schemars/pull/75)
Expand Down
20 changes: 20 additions & 0 deletions schemars/tests/expected/macro_built_struct.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "A",
"type": "object",
"required": [
"v",
"x"
],
"properties": {
"x": {
"type": "integer",
"format": "uint8",
"minimum": 0.0
},
"v": {
"type": "integer",
"format": "int32"
}
}
}
22 changes: 22 additions & 0 deletions schemars/tests/macro.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
mod util;
use schemars::JsonSchema;
use util::*;

macro_rules! build_struct {
(
$id:ident { $($t:tt)* }
) => {
#[derive(Debug, JsonSchema)]
pub struct $id {
x: u8,
$($t)*
}
};
}

build_struct!(A { v: i32 });

#[test]
fn macro_built_struct() -> TestResult {
test_default_generated_schema::<A>("macro_built_struct")
}
46 changes: 25 additions & 21 deletions schemars_derive/src/schema_exprs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -390,32 +390,36 @@ fn expr_for_struct(

let mut type_defs = Vec::new();

let properties: Vec<_> = property_fields.into_iter().map(|field| {
let name = field.name();
let default = field_default_expr(field, set_container_default.is_some());
let properties: Vec<_> = property_fields
.into_iter()
.map(|field| {
let name = field.name();
let default = field_default_expr(field, set_container_default.is_some());

let required = match default {
Some(_) => quote!(false),
None => quote!(true),
};
let required = match default {
Some(_) => quote!(false),
None => quote!(true),
};

let metadata = &SchemaMetadata {
read_only: field.serde_attrs.skip_deserializing(),
write_only: field.serde_attrs.skip_serializing(),
default,
..SchemaMetadata::from_attrs(&field.attrs)
};
let metadata = &SchemaMetadata {
read_only: field.serde_attrs.skip_deserializing(),
write_only: field.serde_attrs.skip_serializing(),
default,
..SchemaMetadata::from_attrs(&field.attrs)
};

let (ty, type_def) = type_for_schema(field, type_defs.len());
if let Some(type_def) = type_def {
type_defs.push(type_def);
}
let (ty, type_def) = type_for_schema(field, type_defs.len());
if let Some(type_def) = type_def {
type_defs.push(type_def);
}

quote_spanned! {ty.span()=>
<#ty as schemars::JsonSchema>::add_schema_as_property(gen, &mut schema_object, #name.to_owned(), #metadata, #required);
}
let args = quote!(gen, &mut schema_object, #name.to_owned(), #metadata, #required);

}).collect();
quote_spanned! {ty.span()=>
<#ty as schemars::JsonSchema>::add_schema_as_property(#args);
}
})
.collect();

let flattens: Vec<_> = flattened_fields
.into_iter()
Expand Down

0 comments on commit 4d34001

Please sign in to comment.