Skip to content

Commit

Permalink
[schema_util] better error messages for enum variants used as params (#…
Browse files Browse the repository at this point in the history
…828)

I've hit this twice in the last few months and forgot how to fix it already after the first time scratching my head against it -- enums need to be wrapped in a struct. Provide a more helpful message, and add tests.
  • Loading branch information
sunshowers authored Nov 30, 2023
1 parent 98f311e commit 164f2ed
Show file tree
Hide file tree
Showing 4 changed files with 283 additions and 53 deletions.
46 changes: 26 additions & 20 deletions dropshot/src/extractor/metadata.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,26 +48,32 @@ where
};

// Convert our collection of struct members list of parameters.
let parameters = schema2struct(&schema, &generator, true)
.into_iter()
.map(|struct_member| {
let mut s = struct_member.schema;
let mut visitor = ReferenceVisitor::new(&generator);
schemars::visit::visit_schema(&mut visitor, &mut s);

ApiEndpointParameter::new_named(
loc,
struct_member.name,
struct_member.description,
struct_member.required,
ApiSchemaGenerator::Static {
schema: Box::new(s),
dependencies: visitor.dependencies(),
},
Vec::new(),
)
})
.collect::<Vec<_>>();
let parameters = schema2struct(
&ParamType::schema_name(),
"parameters",
&schema,
&generator,
true,
)
.into_iter()
.map(|struct_member| {
let mut s = struct_member.schema;
let mut visitor = ReferenceVisitor::new(&generator);
schemars::visit::visit_schema(&mut visitor, &mut s);

ApiEndpointParameter::new_named(
loc,
struct_member.name,
struct_member.description,
struct_member.required,
ApiSchemaGenerator::Static {
schema: Box::new(s),
dependencies: visitor.dependencies(),
},
Vec::new(),
)
})
.collect::<Vec<_>>();

ExtractorMetadata { extension_mode, parameters }
}
Expand Down
40 changes: 23 additions & 17 deletions dropshot/src/handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -986,23 +986,29 @@ impl<
);
let schema = generator.root_schema_for::<H>().schema.into();

let headers = schema2struct(&schema, &generator, true)
.into_iter()
.map(|struct_member| {
let mut s = struct_member.schema;
let mut visitor = ReferenceVisitor::new(&generator);
schemars::visit::visit_schema(&mut visitor, &mut s);
ApiEndpointHeader {
name: struct_member.name,
description: struct_member.description,
schema: ApiSchemaGenerator::Static {
schema: Box::new(s),
dependencies: visitor.dependencies(),
},
required: struct_member.required,
}
})
.collect::<Vec<_>>();
let headers = schema2struct(
&H::schema_name(),
"headers",
&schema,
&generator,
true,
)
.into_iter()
.map(|struct_member| {
let mut s = struct_member.schema;
let mut visitor = ReferenceVisitor::new(&generator);
schemars::visit::visit_schema(&mut visitor, &mut s);
ApiEndpointHeader {
name: struct_member.name,
description: struct_member.description,
schema: ApiSchemaGenerator::Static {
schema: Box::new(s),
dependencies: visitor.dependencies(),
},
required: struct_member.required,
}
})
.collect::<Vec<_>>();

metadata.headers = headers;
metadata
Expand Down
Loading

0 comments on commit 164f2ed

Please sign in to comment.