ploidy_codegen_rust/
statics.rs

1use ploidy_core::codegen::IntoCode;
2use proc_macro2::TokenStream;
3use quote::{ToTokens, TokenStreamExt, quote};
4
5#[derive(Clone, Copy, Debug)]
6pub struct CodegenLibrary;
7
8impl ToTokens for CodegenLibrary {
9    fn to_tokens(&self, tokens: &mut TokenStream) {
10        tokens.append_all(quote! {
11            pub mod types;
12            pub mod client;
13            pub mod error;
14
15            pub use client::Client;
16            pub use error::Error;
17        });
18    }
19}
20
21impl IntoCode for CodegenLibrary {
22    type Code = (&'static str, TokenStream);
23
24    fn into_code(self) -> Self::Code {
25        ("src/lib.rs", self.into_token_stream())
26    }
27}
28
29#[derive(Clone, Copy, Debug)]
30pub struct CodegenErrorModule;
31
32impl ToTokens for CodegenErrorModule {
33    fn to_tokens(&self, tokens: &mut TokenStream) {
34        tokens.append_all(quote! {
35            /// Transport-level error types.
36            #[derive(Debug, thiserror::Error)]
37            pub enum Error {
38                /// Network or connection error.
39                #[error("Network error")]
40                Network(#[from] reqwest::Error),
41
42                /// Invalid JSON in request or response.
43                #[error("Malformed JSON")]
44                Json(#[from] JsonError),
45
46                /// Invalid URL.
47                #[error("Malformed URL")]
48                Url(#[from] url::ParseError),
49
50                /// URL can't be used as a base.
51                #[error("Can't use URL as base URL")]
52                UrlCannotBeABase,
53
54                /// Invalid query parameter.
55                #[error("Invalid query parameter")]
56                QueryParam(#[from] ::ploidy_util::QueryParamError),
57
58                /// Invalid HTTP header name.
59                #[error("invalid header name")]
60                BadHeaderName(#[source] http::Error),
61
62                /// Invalid HTTP header value.
63                #[error("invalid value for header `{0}`")]
64                BadHeaderValue(http::HeaderName, #[source] http::Error),
65            }
66
67            /// Invalid or unexpected JSON, with or without a path
68            /// to the unexpected section.
69            #[derive(Debug, thiserror::Error)]
70            pub enum JsonError {
71                #[error(transparent)]
72                Json(#[from] serde_json::Error),
73                #[error(transparent)]
74                JsonWithPath(#[from] serde_path_to_error::Error<serde_json::Error>),
75            }
76        });
77    }
78}
79
80impl IntoCode for CodegenErrorModule {
81    type Code = (&'static str, TokenStream);
82
83    fn into_code(self) -> Self::Code {
84        ("src/error.rs", self.into_token_stream())
85    }
86}