Skip to content

Commit b05ac6d

Browse files
authored
Merge pull request #31 from golemcloud/better-error-type
Better error type
2 parents a436bb5 + 610b0d0 commit b05ac6d

File tree

3 files changed

+64
-7
lines changed

3 files changed

+64
-7
lines changed

src/rust/client_gen.rs

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use crate::rust::lib_gen::{Module, ModuleDef, ModuleName};
1717
use crate::rust::model_gen::RefCache;
1818
use crate::rust::printer::*;
1919
use crate::rust::types::{
20-
ref_or_box_schema_type, ref_or_schema_type, DataType, RustPrinter, RustResult,
20+
ref_or_box_schema_type, ref_or_schema_type, DataType, ModelType, RustPrinter, RustResult,
2121
};
2222
use crate::{Error, Result};
2323
use convert_case::{Case, Casing};
@@ -672,18 +672,69 @@ fn render_errors(method_name: &str, error_kind: &ErrorKind, errors: &MethodError
672672
.reduce(|acc, e| acc + e)
673673
.unwrap_or_else(unit);
674674

675+
let display_cases = errors
676+
.codes
677+
.iter()
678+
.map(|(code, model)| {
679+
line(
680+
unit()
681+
+ name.clone()
682+
+ "::Error"
683+
+ code.to_string()
684+
+ "(body) => write!(f, \"{}\", "
685+
+ render_error_body_to_string(model)
686+
+ "),",
687+
)
688+
})
689+
.reduce(|acc, e| acc + e)
690+
.unwrap_or_else(unit);
691+
675692
#[rustfmt::skip]
676693
let res = unit() +
677694
line(unit() + "#[derive(Debug)]") +
678-
line(unit() + "pub enum " + name + " {") +
695+
line(unit() + "pub enum " + name.clone() + " {") +
679696
indented(
680697
code_cases
681698
) +
682-
line(unit() + "}");
699+
line(unit() + "}") +
700+
line(unit() + "impl std::fmt::Display for " + name.clone() + " {") +
701+
indented(
702+
line(unit() + "fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {") +
703+
indented(
704+
if !errors.codes.is_empty() {
705+
line(unit() + "match self {") +
706+
indented(display_cases) +
707+
line(unit() + "}")
708+
} else { line(unit() + indented(unit() + "write!(f, \"" + name + "\")")) }
709+
) +
710+
line("}")
711+
) +
712+
line("}");
683713

684714
Ok(res)
685715
}
686716

717+
fn render_error_body_to_string(typ: &DataType) -> RustPrinter {
718+
match typ {
719+
DataType::Model(ModelType { name }) if name == "ErrorBody" => unit() + r#"&body.error"#,
720+
DataType::Model(ModelType { name }) if name == "ErrorsBody" => {
721+
unit() + r#"body.errors.clone().join(", ")"#
722+
}
723+
DataType::Model(ModelType { name }) if name == "WorkerServiceErrorsBody" => {
724+
unit()
725+
+ "match &body { WorkerServiceErrorsBody::Messages("
726+
+ rust_name("crate::model", "ErrorsBody")
727+
+ " { errors }) => { errors.join(\", \") }, WorkerServiceErrorsBody::Validation("
728+
+ rust_name("crate::model", "ErrorsBody")
729+
+ " { errors }) => { errors.join(\", \") }}"
730+
}
731+
DataType::Model(ModelType { name }) if name == "GolemErrorBody" => {
732+
unit() + r#"format!("{}", body.golem_error)"#
733+
}
734+
_ => unit() + r#"format!("{body:?}")"#,
735+
}
736+
}
737+
687738
fn async_annotation() -> RustPrinter {
688739
unit() + "#[" + rust_name("async_trait", "async_trait") + "]"
689740
}

src/rust/error_gen.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,17 @@ pub fn error_gen() -> Module {
1919
let code = indoc! { r#"
2020
use bytes::Bytes;
2121
22-
#[derive(Debug)]
22+
#[derive(Debug, thiserror::Error)]
2323
pub enum Error<T> {
24+
#[error("{0}")]
2425
Item(T),
26+
#[error("Client error: {0}")]
2527
Reqwest(reqwest::Error),
28+
#[error("Invalid header value: {0}")]
2629
ReqwestHeader(reqwest::header::InvalidHeaderValue),
30+
#[error("Deserialization error: {0}")]
2731
Serde(serde_json::Error),
32+
#[error("Unexpected response - status {code}, data: {body}", body = "String::from_utf8_lossy(data.as_ref())")]
2833
Unexpected {
2934
code: u16,
3035
data: Bytes,

src/toml/cargo.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,16 @@ pub fn gen(name: &str, version: &str) -> String {
2929
NewLine +
3030
"[dependencies]" + NewLine +
3131
r#"async-trait = "^0.1""# + NewLine +
32-
r#"bytes = "^1.5""# + NewLine +
32+
r#"bytes = "^1.10""# + NewLine +
3333
r#"chrono = { version = "^0.4", features = ["serde"] }"# + NewLine +
3434
r#"futures-core = "^0.3""# + NewLine +
3535
r#"http = "^1.0""# + NewLine +
36-
r#"reqwest = { version = "^0.11", features = ["gzip", "json", "multipart", "stream"] }"# + NewLine +
36+
r#"reqwest = { version = "^0.12", features = ["gzip", "json", "multipart", "stream"] }"# + NewLine +
3737
r#"serde = { version = "^1.0", features = ["derive"] }"# + NewLine +
3838
r#"serde_json = "^1.0""# + NewLine +
39+
r#"thiserror = "^2"# + NewLine +
3940
r#"tracing = "^0.1""# + NewLine +
40-
r#"uuid = { version = "^1.6", features = ["serde"] }"# + NewLine;
41+
r#"uuid = { version = "^1.15", features = ["serde"] }"# + NewLine;
4142

4243
StringContext::new().print_to_string(code)
4344
}

0 commit comments

Comments
 (0)