cosmwasm_schema_derive/
lib.rs

1//! Derive macros for cosmwasm-schema. For internal use only.
2//!
3//! CosmWasm is a smart contract platform for the Cosmos ecosystem.
4//! For more information, see: <https://cosmwasm.cosmos.network>
5mod cw_serde;
6mod error;
7mod generate_api;
8mod query_responses;
9
10use self::error::fallible_macro;
11use quote::ToTokens;
12use syn::parse_macro_input;
13
14#[derive(Clone, Copy, Debug)]
15enum SchemaBackend {
16    CwSchema,
17    JsonSchema,
18}
19
20impl syn::parse::Parse for SchemaBackend {
21    fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
22        let ident: syn::LitStr = input.parse()?;
23        match ident.value().as_str() {
24            "cw_schema" => Ok(SchemaBackend::CwSchema),
25            "json_schema" => Ok(SchemaBackend::JsonSchema),
26            _ => Err(syn::Error::new(ident.span(), "Unknown schema backend")),
27        }
28    }
29}
30
31fallible_macro! {
32    #[proc_macro_derive(QueryResponses, attributes(returns, query_responses))]
33    pub fn query_responses_derive(
34        input: proc_macro::TokenStream,
35    ) -> syn::Result<proc_macro::TokenStream> {
36        let input = syn::parse(input)?;
37        let expanded = query_responses::query_responses_derive_impl(input)?;
38
39        Ok(expanded.into_token_stream().into())
40    }
41}
42
43#[proc_macro]
44pub fn write_api(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
45    let input = parse_macro_input!(input as generate_api::Options);
46    let expanded = generate_api::write_api_impl(input).into_token_stream();
47
48    proc_macro::TokenStream::from(expanded)
49}
50
51#[proc_macro]
52pub fn generate_api(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
53    let input = parse_macro_input!(input as generate_api::Options);
54    let expanded =
55        generate_api::generate_api_impl(input.schema_backend(), &input).into_token_stream();
56
57    proc_macro::TokenStream::from(expanded)
58}
59
60fallible_macro! {
61    #[proc_macro_attribute]
62    pub fn cw_serde(
63        attr: proc_macro::TokenStream,
64        input: proc_macro::TokenStream,
65    ) -> syn::Result<proc_macro::TokenStream> {
66        let options = syn::parse(attr)?;
67        let input = syn::parse(input)?;
68
69        let expanded = cw_serde::cw_serde_impl(options, input)?;
70
71        Ok(expanded.into_token_stream().into())
72    }
73}