summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCyborus <cyborus@noreply.codeberg.org>2024-01-24 22:04:50 +0100
committerCyborus <cyborus@noreply.codeberg.org>2024-01-24 22:04:50 +0100
commitbcfe3e1e6cecc560fcb85ef717b343ed0acaa0a6 (patch)
tree42b64456004ea6a167e761561900e589f5e412d3
parentreplace hook type with gitea (diff)
parentfix(mistake): order of statements (diff)
downloadforgejo-api-bcfe3e1e6cecc560fcb85ef717b343ed0acaa0a6.tar.xz
forgejo-api-bcfe3e1e6cecc560fcb85ef717b343ed0acaa0a6.zip
Merge pull request 'autogen improvements' (#39) from Aviac/forgejo-api:aviac/autogen into autogen
Reviewed-on: https://codeberg.org/Cyborus/forgejo-api/pulls/39
-rw-r--r--generator/src/main.rs102
1 files changed, 69 insertions, 33 deletions
diff --git a/generator/src/main.rs b/generator/src/main.rs
index cc02416..97073ae 100644
--- a/generator/src/main.rs
+++ b/generator/src/main.rs
@@ -1,4 +1,4 @@
-use std::ffi::OsString;
+use std::ffi::{OsStr, OsString};
mod openapi;
@@ -34,7 +34,7 @@ fn main() -> eyre::Result<()> {
s.push_str(&strukt);
}
s.push_str("\n}");
- save_generated(&mut s)?;
+ save_generated(&s)?;
Ok(())
}
@@ -49,10 +49,23 @@ fn get_spec() -> eyre::Result<OpenApiV2> {
fn save_generated(contents: &str) -> eyre::Result<()> {
let path = std::env::var_os("FORGEJO_API_GENERATED_PATH")
.unwrap_or_else(|| OsString::from("./src/generated.rs"));
- std::fs::write(path, contents)?;
+ std::fs::write(path.as_os_str(), contents)?;
+ run_rustfmt_on(path.as_os_str());
Ok(())
}
+fn run_rustfmt_on(path: &OsStr) {
+ let mut rustfmt = std::process::Command::new("rustfmt");
+
+ rustfmt.arg(path);
+ rustfmt.args(["--edition", "2021"]);
+
+ if let Err(e) = rustfmt.status() {
+ println!("Tried to format {path:?}, but failed to do so! :(");
+ println!("Error:\n{e}");
+ }
+}
+
fn create_methods_for_path(
spec: &OpenApiV2,
path: &str,
@@ -925,20 +938,23 @@ fn create_query_struct(spec: &OpenApiV2, path: &str, op: &Operation) -> eyre::Re
match ty {
ParameterType::String => match param.format.as_deref() {
Some("date-time" | "date") => {
- writeln!(&mut handler, "s.push_str(\"{}=\");", param.name)?;
- writeln!(&mut handler, "s.push_str(&{field_name}.format(&time::format_description::well_known::Rfc3339).unwrap());")?;
- writeln!(&mut handler, "s.push('&');")?;
+ writeln!(
+ &mut handler,
+ "write!(f, \"{}={{field_name}}&\", field_name = {field_name}.format(&time::format_description::well_known::Rfc3339).unwrap())?;",
+ param.name)?;
}
_ => {
- writeln!(&mut handler, "s.push_str(\"{}=\");", param.name)?;
- writeln!(&mut handler, "s.push_str(&{field_name});")?;
- writeln!(&mut handler, "s.push('&');")?;
+ writeln!(
+ &mut handler,
+ "write!(f, \"{}={{{}}}&\")?;",
+ param.name, field_name
+ )?;
}
},
ParameterType::Number | ParameterType::Integer | ParameterType::Boolean => {
writeln!(
&mut handler,
- "write!(&mut s, \"{}={{}}&\", {field_name}).unwrap();",
+ "write!(f, \"{}={{{field_name}}}&\")?;",
param.name
)?;
}
@@ -952,17 +968,17 @@ fn create_query_struct(spec: &OpenApiV2, path: &str, op: &Operation) -> eyre::Re
ParameterType::String => {
match param.format.as_deref() {
Some("date-time" | "date") => {
- "s.push_str(&item.format(&time::format_description::well_known::Rfc3339).unwrap());"
+ "write!(f, \"{{date}}\", item.format(&time::format_description::well_known::Rfc3339).unwrap())?;"
},
_ => {
- "s.push_str(&item);"
+ "write!(f, \"{item}\")?;"
}
}
},
ParameterType::Number |
ParameterType::Integer |
ParameterType::Boolean => {
- "write!(&mut s, \"{item}\").unwrap();"
+ "write!(f, \"{item}\")?;"
},
ParameterType::Array => {
eyre::bail!("nested arrays not supported in query");
@@ -1003,13 +1019,13 @@ fn create_query_struct(spec: &OpenApiV2, path: &str, op: &Operation) -> eyre::Re
)?);
}
CollectionFormat::Multi => {
- writeln!(&mut handler, "")?;
+ writeln!(&mut handler)?;
writeln!(&mut handler, "if !{field_name}.is_empty() {{")?;
writeln!(&mut handler, "for item in {field_name} {{")?;
- writeln!(&mut handler, "s.push_str(\"{}=\");", param.name)?;
+ writeln!(&mut handler, "write!(f, \"{}=\")?;", param.name)?;
handler.push_str(item_pusher);
handler.push('\n');
- writeln!(&mut handler, "s.push('&')")?;
+ writeln!(&mut handler, "write!(f, '&')?;")?;
writeln!(&mut handler, "}}")?;
writeln!(&mut handler, "}}")?;
}
@@ -1023,17 +1039,32 @@ fn create_query_struct(spec: &OpenApiV2, path: &str, op: &Operation) -> eyre::Re
imp.push_str(&handler);
}
}
- imp.push_str("s\n");
- if fields.is_empty() {
- return Ok(String::new());
+
+ let result = if fields.is_empty() {
+ String::new()
} else {
let op_name = op
.operation_id
.as_ref()
.ok_or_else(|| eyre::eyre!("no op id found"))?
.to_pascal_case();
- return Ok(format!("pub struct {op_name}Query {{\n{fields}\n}}\n\nimpl {op_name}Query {{\npub(crate) fn to_string(self) -> String {{\n{imp}\n}}\n}}"));
- }
+ format!(
+ "
+pub struct {op_name}Query {{
+ {fields}
+}}
+
+impl std::fmt::Display for {op_name}Query {{
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {{
+ {imp}
+ Ok(())
+ }}
+}}
+"
+ )
+ };
+
+ Ok(result)
}
fn simple_query_array(
@@ -1043,17 +1074,22 @@ fn simple_query_array(
sep: &str,
) -> eyre::Result<String> {
let mut out = String::new();
- writeln!(&mut out, "s.push_str(\"{}=\");", param.name)?;
- writeln!(&mut out, "")?;
- writeln!(&mut out, "if !{name}.is_empty() {{")?;
- writeln!(&mut out, "for (i, item) in {name}.iter().enumerate() {{")?;
- out.push_str(item_pusher);
- out.push('\n');
- writeln!(&mut out, "if i < {name}.len() - 1 {{")?;
- writeln!(&mut out, "s.push('{sep}')")?;
- writeln!(&mut out, "}}")?;
- writeln!(&mut out, "}}")?;
- writeln!(&mut out, "s.push('&')")?;
- writeln!(&mut out, "}}")?;
+
+ writeln!(
+ &mut out,
+ "
+if !{name}.is_empty() {{
+ write!(f, \"{}=\")?;
+ for (item, i) in {name}.iter().enumerate() {{
+ {item_pusher}
+ if i < {name}.len() - 1 {{
+ write!(f, '{sep}')?;
+ }}
+ }}
+ write!(f, '&')?;
+}}",
+ param.name
+ )?;
+
Ok(out)
}