Refactor subschema generation

This commit is contained in:
Graham Esau 2019-08-05 21:05:31 +01:00
parent 4a9fdd3334
commit 463ba518b6

View file

@ -23,25 +23,33 @@ impl SchemaGenerator {
} }
let type_id = T::schema_type_id(); let type_id = T::schema_type_id();
// TODO is there a nicer way to do this? let name = self
if !self.definitions.contains_key(&type_id) { .definitions
let name = self.make_unique_name::<T>(); .get(&type_id)
self.names.insert(name.clone()); .map(|(n, _)| n.clone())
// insert into definitions BEFORE calling make_schema to avoid infinite recursion .unwrap_or_else(|| {
let dummy = Schema::Bool(false); let name = self.make_unique_name::<T>();
self.definitions self.names.insert(name.clone());
.insert(type_id.clone(), (name.clone(), dummy)); self.insert_new_subschema_for::<T>(type_id, name.clone());
name
});
let reference = format!("#/definitions/{}", name);
SchemaRef { reference }.into()
}
let schema = T::make_schema(self); fn insert_new_subschema_for<T: ?Sized + MakeSchema>(
self.definitions &mut self,
.entry(type_id.clone()) type_id: SchemaTypeId,
.and_modify(|(_, s)| *s = schema); name: String,
} ) {
let ref name = self.definitions.get(&type_id).unwrap().0; let dummy = Schema::Bool(false);
SchemaRef { // insert into definitions BEFORE calling make_schema to avoid infinite recursion
reference: format!("#/definitions/{}", name), self.definitions.insert(type_id.clone(), (name, dummy));
}
.into() let schema = T::make_schema(self);
self.definitions
.entry(type_id)
.and_modify(|(_, s)| *s = schema);
} }
pub fn definitions(&self) -> Map<String, Schema> { pub fn definitions(&self) -> Map<String, Schema> {