From 580b1c90a210ac5a0e37045320f8aed22e1f10b7 Mon Sep 17 00:00:00 2001 From: "Joshua M. Clulow" Date: Fri, 17 Sep 2021 18:45:12 +0000 Subject: [PATCH] type definitions should occur in a stable order --- src/main.rs | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/main.rs b/src/main.rs index 5f6b292..64b6d99 100644 --- a/src/main.rs +++ b/src/main.rs @@ -968,15 +968,30 @@ fn gen(api: &OpenAPI, ts: &mut TypeSpace) -> Result { a(""); /* - * Declare named types we know about: + * Declare named types we know about. We want the declarations to appear in + * a stable order within the file, so we first collect a list of type IDs + * that we can sort by their visible name. */ + let mut ids = ts.id_to_entry.values().filter_map(|te| match &te.details { + TypeDetails::Object(_) + | TypeDetails::NewType(_) + | TypeDetails::Enumeration(_) => { + Some((te.name.as_deref().unwrap(), &te.id)) + } + TypeDetails::Basic + | TypeDetails::Unknown + | TypeDetails::Array(_) + | TypeDetails::Optional(_) => None, + }).collect::>(); + ids.sort_by(|a, b| a.0.cmp(&b.0)); + a("pub mod types {"); if ts.import_chrono { a(" use chrono::prelude::*;"); } a(" use serde::{Serialize, Deserialize};"); a(""); - for te in ts.id_to_entry.values() { + for te in ids.iter().map(|x| ts.id_to_entry.get(x.1).unwrap()) { match &te.details { TypeDetails::Object(omap) => { a(" #[derive(Serialize, Deserialize, Debug, Clone)]"); @@ -1047,10 +1062,7 @@ fn gen(api: &OpenAPI, ts: &mut TypeSpace) -> Result { a(" }"); a(""); } - TypeDetails::Basic => {} - TypeDetails::Unknown => {} - TypeDetails::Array(_) => {} - TypeDetails::Optional(_) => {} + x => panic!("unexpected type details here: {:?}", x), } } a("}");