autogenerate structs
This commit is contained in:
parent
12f2800b26
commit
f30b4eba30
|
@ -18,7 +18,14 @@ fn main() -> eyre::Result<()> {
|
||||||
for (path, item) in &spec.paths {
|
for (path, item) in &spec.paths {
|
||||||
s.push_str(&create_methods_for_path(&spec, path, item).wrap_err_with(|| path.clone())?);
|
s.push_str(&create_methods_for_path(&spec, path, item).wrap_err_with(|| path.clone())?);
|
||||||
}
|
}
|
||||||
s.push('}');
|
s.push_str("}\n");
|
||||||
|
|
||||||
|
if let Some(definitions) = &spec.definitions {
|
||||||
|
for (name, schema) in definitions {
|
||||||
|
let strukt = create_struct_for_definition(&spec, name, schema)?;
|
||||||
|
s.push_str(&strukt);
|
||||||
|
}
|
||||||
|
}
|
||||||
save_generated(&mut s)?;
|
save_generated(&mut s)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -575,10 +582,59 @@ fn sanitize_ident(mut s: String) -> String {
|
||||||
"as", "break", "const", "continue", "crate", "else", "enum", "extern", "false", "fn",
|
"as", "break", "const", "continue", "crate", "else", "enum", "extern", "false", "fn",
|
||||||
"for", "if", "impl", "in", "let", "loop", "match", "mod", "move", "mut", "pub", "ref",
|
"for", "if", "impl", "in", "let", "loop", "match", "mod", "move", "mut", "pub", "ref",
|
||||||
"return", "self", "Self", "static", "struct", "super", "trait", "true", "type", "unsafe",
|
"return", "self", "Self", "static", "struct", "super", "trait", "true", "type", "unsafe",
|
||||||
"use", "where", "while",
|
"use", "where", "while", "abstract", "become", "box", "do", "final", "macro", "override",
|
||||||
|
"priv", "typeof", "unsized", "virtual", "yield", "async", "await", "dyn", "try",
|
||||||
|
"macro_rules", "union"
|
||||||
];
|
];
|
||||||
|
if s == "self" {
|
||||||
|
s = "this".into();
|
||||||
|
}
|
||||||
if keywords.contains(&&*s) {
|
if keywords.contains(&&*s) {
|
||||||
s.insert_str(0, "r#");
|
s.insert_str(0, "r#");
|
||||||
}
|
}
|
||||||
s
|
s
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn create_struct_for_definition(spec: &OpenApiV2, name: &str, schema: &Schema) -> eyre::Result<String> {
|
||||||
|
if matches!(schema._type, Some(SchemaType::One(Primitive::Array))) {
|
||||||
|
return Ok(String::new());
|
||||||
|
}
|
||||||
|
|
||||||
|
let docs = create_struct_docs(schema)?;
|
||||||
|
let mut fields = String::new();
|
||||||
|
let required = schema.required.as_deref().unwrap_or_default();
|
||||||
|
if let Some(properties) = &schema.properties {
|
||||||
|
for (prop_name, prop_schema) in properties {
|
||||||
|
let prop_ty = schema_ref_type_name(spec, prop_schema)?;
|
||||||
|
let field_name = sanitize_ident(prop_name.to_snake_case());
|
||||||
|
let field_ty = if required.contains(prop_name) {
|
||||||
|
prop_ty
|
||||||
|
} else {
|
||||||
|
format!("Option<{prop_ty}>")
|
||||||
|
};
|
||||||
|
fields.push_str(&field_name);
|
||||||
|
fields.push_str(": ");
|
||||||
|
fields.push_str(&field_ty);
|
||||||
|
fields.push_str(",\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let out = format!("{docs}pub struct {name} {{\n{fields}}}\n\n");
|
||||||
|
Ok(out)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn create_struct_docs(schema: &Schema) -> eyre::Result<String> {
|
||||||
|
let doc = match &schema.description {
|
||||||
|
Some(desc) => {
|
||||||
|
let mut out = String::new();
|
||||||
|
for line in desc.lines() {
|
||||||
|
out.push_str("/// ");
|
||||||
|
out.push_str(line);
|
||||||
|
out.push_str("\n/// \n");
|
||||||
|
}
|
||||||
|
out
|
||||||
|
},
|
||||||
|
None => String::new(),
|
||||||
|
};
|
||||||
|
Ok(doc)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue