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