(&mut self, name: &str)
| 729 | } |
| 730 | |
| 731 | fn ensure_message_generated(&mut self, name: &str) -> Result<()> { |
| 732 | if self.generated.contains_key(&schema_key(name)) { |
| 733 | return Ok(()); |
| 734 | } |
| 735 | if !self.visited.insert(name.to_string()) { |
| 736 | bail!("cyclic reference detected while processing {}", name); |
| 737 | } |
| 738 | let descriptor = self |
| 739 | .registry |
| 740 | .message(name) |
| 741 | .ok_or_else(|| anyhow!("message {} not found", name))?; |
| 742 | |
| 743 | let mut required = Vec::new(); |
| 744 | let mut props = BTreeMap::new(); |
| 745 | for field in &descriptor.descriptor.field { |
| 746 | let field_name = field.name.clone().unwrap_or_default(); |
| 747 | let mut schema = self.field_schema(field)?; |
| 748 | if let Some(doc) = descriptor.field_comments.get(&field_name) { |
| 749 | apply_schema_description(&mut schema, doc); |
| 750 | } |
| 751 | if is_required_field(field) { |
| 752 | required.push(field_name.clone()); |
| 753 | } |
| 754 | props.insert(field_name, schema); |
| 755 | } |
| 756 | |
| 757 | let mut obj = Map::new(); |
| 758 | obj.insert("type".into(), Value::String("object".into())); |
| 759 | let mut properties = Map::new(); |
| 760 | for (k, v) in props { |
| 761 | properties.insert(k, v); |
| 762 | } |
| 763 | obj.insert("properties".into(), Value::Object(properties)); |
| 764 | if let Some(doc) = &descriptor.description { |
| 765 | obj.insert("description".into(), Value::String(doc.clone())); |
| 766 | } |
| 767 | if !required.is_empty() { |
| 768 | obj.insert( |
| 769 | "required".into(), |
| 770 | Value::Array(required.into_iter().map(Value::String).collect()), |
| 771 | ); |
| 772 | } |
| 773 | |
| 774 | self.generated.insert(schema_key(name), Value::Object(obj)); |
| 775 | self.visited.remove(name); |
| 776 | Ok(()) |
| 777 | } |
| 778 | |
| 779 | fn ensure_enum_generated(&mut self, name: &str) -> Result<()> { |
| 780 | if self.generated.contains_key(&schema_key(name)) { |
no test coverage detected