diff --git a/crates/ruma-common/src/api.rs b/crates/ruma-common/src/api.rs index e1a994c5..ef1031bc 100644 --- a/crates/ruma-common/src/api.rs +++ b/crates/ruma-common/src/api.rs @@ -193,19 +193,6 @@ use crate::UserId; pub use ruma_macros::ruma_api; pub mod error; -/// This module is used to support the generated code from ruma-macros. -/// It is not considered part of ruma-common's public API. -#[doc(hidden)] -pub mod exports { - pub use bytes; - pub use http; - pub use percent_encoding; - pub use ruma_macros; - pub use ruma_serde; - pub use serde; - pub use serde_json; -} - mod metadata; pub use metadata::{MatrixVersion, Metadata}; diff --git a/crates/ruma-common/src/lib.rs b/crates/ruma-common/src/lib.rs index 7f6225c3..d8caf213 100644 --- a/crates/ruma-common/src/lib.rs +++ b/crates/ruma-common/src/lib.rs @@ -60,6 +60,12 @@ impl fmt::Debug for PrivOwnedStr { /// It is not considered part of this module's public API. #[doc(hidden)] pub mod exports { + #[cfg(feature = "api")] + pub use bytes; + #[cfg(feature = "api")] + pub use http; + pub use percent_encoding; + pub use ruma_macros; pub use ruma_serde; pub use serde; pub use serde_json; diff --git a/crates/ruma-macros/src/api.rs b/crates/ruma-macros/src/api.rs index 5b721258..70250d62 100644 --- a/crates/ruma-macros/src/api.rs +++ b/crates/ruma-macros/src/api.rs @@ -9,6 +9,7 @@ use syn::{ }; use self::{api_metadata::Metadata, api_request::Request, api_response::Response}; +use crate::util::import_ruma_common; mod api_metadata; mod api_request; @@ -45,8 +46,8 @@ pub struct Api { impl Api { pub fn expand_all(self) -> TokenStream { - let ruma_api = util::import_ruma_api(); - let http = quote! { #ruma_api::exports::http }; + let ruma_common = import_ruma_common(); + let http = quote! { #ruma_common::exports::http }; let metadata = &self.metadata; let description = &metadata.description; @@ -61,18 +62,19 @@ impl Api { let deprecated = util::map_option_literal(&metadata.deprecated); let removed = util::map_option_literal(&metadata.removed); - let error_ty = self - .error_ty - .map_or_else(|| quote! { #ruma_api::error::MatrixError }, |err_ty| quote! { #err_ty }); + let error_ty = self.error_ty.map_or_else( + || quote! { #ruma_common::api::error::MatrixError }, + |err_ty| quote! { #err_ty }, + ); - let request = self.request.map(|req| req.expand(metadata, &error_ty, &ruma_api)); - let response = self.response.map(|res| res.expand(metadata, &error_ty, &ruma_api)); + let request = self.request.map(|req| req.expand(metadata, &error_ty, &ruma_common)); + let response = self.response.map(|res| res.expand(metadata, &error_ty, &ruma_common)); let metadata_doc = format!("Metadata for the `{}` API endpoint.", name.value()); quote! { #[doc = #metadata_doc] - pub const METADATA: #ruma_api::Metadata = #ruma_api::Metadata { + pub const METADATA: #ruma_common::api::Metadata = #ruma_common::api::Metadata { description: #description, method: #http::Method::#method, name: #name, @@ -83,7 +85,7 @@ impl Api { deprecated: #deprecated, removed: #removed, rate_limited: #rate_limited, - authentication: #ruma_api::AuthScheme::#authentication, + authentication: #ruma_common::api::AuthScheme::#authentication, }; #request diff --git a/crates/ruma-macros/src/api/api_request.rs b/crates/ruma-macros/src/api/api_request.rs index 1d0cb388..77f7b6b1 100644 --- a/crates/ruma-macros/src/api/api_request.rs +++ b/crates/ruma-macros/src/api/api_request.rs @@ -71,10 +71,10 @@ impl Request { &self, metadata: &Metadata, error_ty: &TokenStream, - ruma_api: &TokenStream, + ruma_common: &TokenStream, ) -> TokenStream { - let ruma_macros = quote! { #ruma_api::exports::ruma_macros }; - let ruma_serde = quote! { #ruma_api::exports::ruma_serde }; + let ruma_macros = quote! { #ruma_common::exports::ruma_macros }; + let ruma_serde = quote! { #ruma_common::exports::ruma_serde }; let docs = format!( "Data for a request to the `{}` API endpoint.\n\n{}", diff --git a/crates/ruma-macros/src/api/request.rs b/crates/ruma-macros/src/api/request.rs index 4b3dcbc2..69f5c78e 100644 --- a/crates/ruma-macros/src/api/request.rs +++ b/crates/ruma-macros/src/api/request.rs @@ -16,8 +16,9 @@ use syn::{ use super::{ attribute::{Meta, MetaNameValue, MetaValue}, auth_scheme::AuthScheme, - util::{collect_lifetime_idents, import_ruma_api}, + util::collect_lifetime_idents, }; +use crate::util::import_ruma_common; mod incoming; mod outgoing; @@ -196,10 +197,10 @@ impl Request { } fn expand_all(&self) -> TokenStream { - let ruma_api = import_ruma_api(); - let ruma_macros = quote! { #ruma_api::exports::ruma_macros }; - let ruma_serde = quote! { #ruma_api::exports::ruma_serde }; - let serde = quote! { #ruma_api::exports::serde }; + let ruma_common = import_ruma_common(); + let ruma_macros = quote! { #ruma_common::exports::ruma_macros }; + let ruma_serde = quote! { #ruma_common::exports::ruma_serde }; + let serde = quote! { #ruma_common::exports::serde }; let request_body_struct = self.has_body_fields().then(|| { let serde_attr = self.has_newtype_body().then(|| quote! { #[serde(transparent)] }); @@ -253,8 +254,8 @@ impl Request { } }); - let outgoing_request_impl = self.expand_outgoing(&ruma_api); - let incoming_request_impl = self.expand_incoming(&ruma_api); + let outgoing_request_impl = self.expand_outgoing(&ruma_common); + let incoming_request_impl = self.expand_incoming(&ruma_common); quote! { #request_body_struct diff --git a/crates/ruma-macros/src/api/request/incoming.rs b/crates/ruma-macros/src/api/request/incoming.rs index 4287e700..b16a371c 100644 --- a/crates/ruma-macros/src/api/request/incoming.rs +++ b/crates/ruma-macros/src/api/request/incoming.rs @@ -6,11 +6,11 @@ use super::{Request, RequestField}; use crate::api::auth_scheme::AuthScheme; impl Request { - pub fn expand_incoming(&self, ruma_api: &TokenStream) -> TokenStream { - let http = quote! { #ruma_api::exports::http }; - let ruma_serde = quote! { #ruma_api::exports::ruma_serde }; - let serde = quote! { #ruma_api::exports::serde }; - let serde_json = quote! { #ruma_api::exports::serde_json }; + pub fn expand_incoming(&self, ruma_common: &TokenStream) -> TokenStream { + let http = quote! { #ruma_common::exports::http }; + let ruma_serde = quote! { #ruma_common::exports::ruma_serde }; + let serde = quote! { #ruma_common::exports::serde }; + let serde_json = quote! { #ruma_common::exports::serde_json }; let method = &self.method; let error_ty = &self.error_ty; @@ -104,7 +104,7 @@ impl Request { quote! { str_value.to_owned() }, quote! { return Err( - #ruma_api::error::HeaderDeserializationError::MissingHeader( + #ruma_common::api::error::HeaderDeserializationError::MissingHeader( #header_name_string.into() ).into(), ) @@ -187,29 +187,29 @@ impl Request { quote! { #[automatically_derived] #[cfg(feature = "server")] - impl #ruma_api::IncomingNonAuthRequest for #incoming_request_type {} + impl #ruma_common::api::IncomingNonAuthRequest for #incoming_request_type {} } }); quote! { #[automatically_derived] #[cfg(feature = "server")] - impl #ruma_api::IncomingRequest for #incoming_request_type { + impl #ruma_common::api::IncomingRequest for #incoming_request_type { type EndpointError = #error_ty; type OutgoingResponse = Response; - const METADATA: #ruma_api::Metadata = self::METADATA; + const METADATA: #ruma_common::api::Metadata = self::METADATA; fn try_from_http_request( request: #http::Request, path_args: &[S], - ) -> ::std::result::Result + ) -> ::std::result::Result where B: ::std::convert::AsRef<[::std::primitive::u8]>, S: ::std::convert::AsRef<::std::primitive::str>, { if request.method() != #http::Method::#method { - return Err(#ruma_api::error::FromHttpRequestError::MethodMismatch { + return Err(#ruma_common::api::error::FromHttpRequestError::MethodMismatch { expected: #http::Method::#method, received: request.method().clone(), }); diff --git a/crates/ruma-macros/src/api/request/outgoing.rs b/crates/ruma-macros/src/api/request/outgoing.rs index 51e3546d..ce96db26 100644 --- a/crates/ruma-macros/src/api/request/outgoing.rs +++ b/crates/ruma-macros/src/api/request/outgoing.rs @@ -6,11 +6,11 @@ use super::{Request, RequestField}; use crate::api::{auth_scheme::AuthScheme, util}; impl Request { - pub fn expand_outgoing(&self, ruma_api: &TokenStream) -> TokenStream { - let bytes = quote! { #ruma_api::exports::bytes }; - let http = quote! { #ruma_api::exports::http }; - let percent_encoding = quote! { #ruma_api::exports::percent_encoding }; - let ruma_serde = quote! { #ruma_api::exports::ruma_serde }; + pub fn expand_outgoing(&self, ruma_common: &TokenStream) -> TokenStream { + let bytes = quote! { #ruma_common::exports::bytes }; + let http = quote! { #ruma_common::exports::http }; + let percent_encoding = quote! { #ruma_common::exports::percent_encoding }; + let ruma_serde = quote! { #ruma_common::exports::ruma_serde }; let method = &self.method; let error_ty = &self.error_ty; @@ -139,7 +139,7 @@ impl Request { "Bearer {}", access_token .get_required_for_endpoint() - .ok_or(#ruma_api::error::IntoHttpError::NeedsAuthentication)?, + .ok_or(#ruma_common::api::error::IntoHttpError::NeedsAuthentication)?, ))?, ); }, @@ -177,7 +177,7 @@ impl Request { quote! { #[automatically_derived] #[cfg(feature = "client")] - impl #impl_generics #ruma_api::OutgoingNonAuthRequest + impl #impl_generics #ruma_common::api::OutgoingNonAuthRequest for Request #ty_generics #where_clause {} } }); @@ -185,18 +185,18 @@ impl Request { quote! { #[automatically_derived] #[cfg(feature = "client")] - impl #impl_generics #ruma_api::OutgoingRequest for Request #ty_generics #where_clause { + impl #impl_generics #ruma_common::api::OutgoingRequest for Request #ty_generics #where_clause { type EndpointError = #error_ty; type IncomingResponse = ::Incoming; - const METADATA: #ruma_api::Metadata = self::METADATA; + const METADATA: #ruma_common::api::Metadata = self::METADATA; fn try_into_http_request( self, base_url: &::std::primitive::str, - access_token: #ruma_api::SendAccessToken<'_>, - considering_versions: &'_ [#ruma_api::MatrixVersion], - ) -> ::std::result::Result<#http::Request, #ruma_api::error::IntoHttpError> { + access_token: #ruma_common::api::SendAccessToken<'_>, + considering_versions: &'_ [#ruma_common::api::MatrixVersion], + ) -> ::std::result::Result<#http::Request, #ruma_common::api::error::IntoHttpError> { let metadata = self::METADATA; let mut req_builder = #http::Request::builder() @@ -204,7 +204,7 @@ impl Request { .uri(::std::format!( "{}{}{}", base_url.strip_suffix('/').unwrap_or(base_url), - #ruma_api::select_path(considering_versions, &metadata, #unstable_path, #r0_path, #stable_path)?, + #ruma_common::api::select_path(considering_versions, &metadata, #unstable_path, #r0_path, #stable_path)?, #request_query_string, )); diff --git a/crates/ruma-macros/src/api/response.rs b/crates/ruma-macros/src/api/response.rs index a7aa7f9c..24509c75 100644 --- a/crates/ruma-macros/src/api/response.rs +++ b/crates/ruma-macros/src/api/response.rs @@ -13,10 +13,8 @@ use syn::{ DeriveInput, Field, Generics, Ident, Lifetime, Token, Type, }; -use super::{ - attribute::{Meta, MetaNameValue}, - util, -}; +use super::attribute::{Meta, MetaNameValue}; +use crate::util::import_ruma_common; mod incoming; mod outgoing; @@ -95,10 +93,10 @@ impl Response { } fn expand_all(&self) -> TokenStream { - let ruma_api = util::import_ruma_api(); - let ruma_macros = quote! { #ruma_api::exports::ruma_macros }; - let ruma_serde = quote! { #ruma_api::exports::ruma_serde }; - let serde = quote! { #ruma_api::exports::serde }; + let ruma_common = import_ruma_common(); + let ruma_macros = quote! { #ruma_common::exports::ruma_macros }; + let ruma_serde = quote! { #ruma_common::exports::ruma_serde }; + let serde = quote! { #ruma_common::exports::serde }; let response_body_struct = (!self.has_raw_body()).then(|| { let serde_derives = self.manual_body_serde.not().then(|| { @@ -121,8 +119,8 @@ impl Response { } }); - let outgoing_response_impl = self.expand_outgoing(&ruma_api); - let incoming_response_impl = self.expand_incoming(&self.error_ty, &ruma_api); + let outgoing_response_impl = self.expand_outgoing(&ruma_common); + let incoming_response_impl = self.expand_incoming(&self.error_ty, &ruma_common); quote! { #response_body_struct diff --git a/crates/ruma-macros/src/api/response/incoming.rs b/crates/ruma-macros/src/api/response/incoming.rs index 39ee8a3c..3107c182 100644 --- a/crates/ruma-macros/src/api/response/incoming.rs +++ b/crates/ruma-macros/src/api/response/incoming.rs @@ -5,10 +5,10 @@ use syn::Type; use super::{Response, ResponseField}; impl Response { - pub fn expand_incoming(&self, error_ty: &Type, ruma_api: &TokenStream) -> TokenStream { - let http = quote! { #ruma_api::exports::http }; - let ruma_serde = quote! { #ruma_api::exports::ruma_serde }; - let serde_json = quote! { #ruma_api::exports::serde_json }; + pub fn expand_incoming(&self, error_ty: &Type, ruma_common: &TokenStream) -> TokenStream { + let http = quote! { #ruma_common::exports::http }; + let ruma_serde = quote! { #ruma_common::exports::ruma_serde }; + let serde_json = quote! { #ruma_common::exports::serde_json }; let extract_response_headers = self.has_header_fields().then(|| { quote! { @@ -111,14 +111,14 @@ impl Response { quote! { #[automatically_derived] #[cfg(feature = "client")] - impl #ruma_api::IncomingResponse for Response { + impl #ruma_common::api::IncomingResponse for Response { type EndpointError = #error_ty; fn try_from_http_response>( response: #http::Response, ) -> ::std::result::Result< Self, - #ruma_api::error::FromHttpResponseError<#error_ty>, + #ruma_common::api::error::FromHttpResponseError<#error_ty>, > { if response.status().as_u16() < 400 { #extract_response_headers @@ -128,14 +128,14 @@ impl Response { #response_init_fields }) } else { - match <#error_ty as #ruma_api::EndpointError>::try_from_http_response( + match <#error_ty as #ruma_common::api::EndpointError>::try_from_http_response( response ) { ::std::result::Result::Ok(err) => { - Err(#ruma_api::error::ServerError::Known(err).into()) + Err(#ruma_common::api::error::ServerError::Known(err).into()) } ::std::result::Result::Err(response_err) => { - Err(#ruma_api::error::ServerError::Unknown(response_err).into()) + Err(#ruma_common::api::error::ServerError::Unknown(response_err).into()) } } } diff --git a/crates/ruma-macros/src/api/response/outgoing.rs b/crates/ruma-macros/src/api/response/outgoing.rs index c84e4590..c38759d3 100644 --- a/crates/ruma-macros/src/api/response/outgoing.rs +++ b/crates/ruma-macros/src/api/response/outgoing.rs @@ -4,10 +4,10 @@ use quote::quote; use super::{Response, ResponseField}; impl Response { - pub fn expand_outgoing(&self, ruma_api: &TokenStream) -> TokenStream { - let bytes = quote! { #ruma_api::exports::bytes }; - let http = quote! { #ruma_api::exports::http }; - let ruma_serde = quote! { #ruma_api::exports::ruma_serde }; + pub fn expand_outgoing(&self, ruma_common: &TokenStream) -> TokenStream { + let bytes = quote! { #ruma_common::exports::bytes }; + let http = quote! { #ruma_common::exports::http }; + let ruma_serde = quote! { #ruma_common::exports::ruma_serde }; let serialize_response_headers = self.fields.iter().filter_map(|response_field| { response_field.as_header_field().map(|(field, header_name)| { @@ -64,10 +64,10 @@ impl Response { quote! { #[automatically_derived] #[cfg(feature = "server")] - impl #ruma_api::OutgoingResponse for Response { + impl #ruma_common::api::OutgoingResponse for Response { fn try_into_http_response( self, - ) -> ::std::result::Result<#http::Response, #ruma_api::error::IntoHttpError> { + ) -> ::std::result::Result<#http::Response, #ruma_common::api::error::IntoHttpError> { let mut resp_builder = #http::Response::builder() .header(#http::header::CONTENT_TYPE, "application/json"); diff --git a/crates/ruma-macros/src/api/util.rs b/crates/ruma-macros/src/api/util.rs index f82fbe7c..220992c1 100644 --- a/crates/ruma-macros/src/api/util.rs +++ b/crates/ruma-macros/src/api/util.rs @@ -3,28 +3,9 @@ use std::collections::BTreeSet; use proc_macro2::{Ident, Span, TokenStream}; -use proc_macro_crate::{crate_name, FoundCrate}; -use quote::{format_ident, quote, ToTokens}; +use quote::{quote, ToTokens}; use syn::{parse_quote, visit::Visit, Attribute, Lifetime, NestedMeta, Type}; -pub fn import_ruma_api() -> TokenStream { - if let Ok(FoundCrate::Name(name)) = crate_name("ruma-common") { - let import = format_ident!("{}", name); - quote! { ::#import::api } - } else if let Ok(FoundCrate::Name(name)) = crate_name("ruma") { - let import = format_ident!("{}", name); - quote! { ::#import::api } - } else if let Ok(FoundCrate::Name(name)) = crate_name("matrix-sdk") { - let import = format_ident!("{}", name); - quote! { ::#import::ruma::api } - } else if let Ok(FoundCrate::Name(name)) = crate_name("matrix-sdk-appservice") { - let import = format_ident!("{}", name); - quote! { ::#import::ruma::api } - } else { - quote! { ::ruma_common::api } - } -} - pub fn map_option_literal(ver: &Option) -> TokenStream { match ver { Some(v) => quote! { ::std::option::Option::Some(#v) },