macros: Merge ruma-identifiers-macros into ruma-macros
This commit is contained in:
		
							parent
							
								
									c52e51c016
								
							
						
					
					
						commit
						60eb51ee0e
					
				| @ -1,17 +0,0 @@ | |||||||
| [package] |  | ||||||
| description = "Procedural macros for creating Matrix identifiers." |  | ||||||
| homepage = "https://www.ruma.io/" |  | ||||||
| keywords = ["matrix", "chat", "messaging", "ruma"] |  | ||||||
| license = "MIT" |  | ||||||
| name = "ruma-identifiers-macros" |  | ||||||
| repository = "https://github.com/ruma/ruma" |  | ||||||
| version = "0.22.0" |  | ||||||
| edition = "2018" |  | ||||||
| 
 |  | ||||||
| [lib] |  | ||||||
| proc-macro = true |  | ||||||
| 
 |  | ||||||
| [dependencies] |  | ||||||
| quote = "1.0.8" |  | ||||||
| ruma-identifiers-validation = { version = "0.7.0", path = "../ruma-identifiers-validation", default-features = false } |  | ||||||
| syn = "1.0.55" |  | ||||||
| @ -1,133 +0,0 @@ | |||||||
| #![doc(html_favicon_url = "https://www.ruma.io/favicon.ico")] |  | ||||||
| #![doc(html_logo_url = "https://www.ruma.io/images/logo.png")] |  | ||||||
| 
 |  | ||||||
| use proc_macro::TokenStream; |  | ||||||
| use quote::quote; |  | ||||||
| use ruma_identifiers_validation::{ |  | ||||||
|     device_key_id, event_id, key_id, mxc_uri, room_alias_id, room_id, room_version_id, server_name, |  | ||||||
|     user_id, |  | ||||||
| }; |  | ||||||
| use syn::{parse::Parse, parse_macro_input, LitStr, Path, Token}; |  | ||||||
| 
 |  | ||||||
| struct Input { |  | ||||||
|     dollar_crate: Path, |  | ||||||
|     id: LitStr, |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| impl Parse for Input { |  | ||||||
|     fn parse(input: syn::parse::ParseStream<'_>) -> syn::Result<Self> { |  | ||||||
|         let dollar_crate = input.parse()?; |  | ||||||
|         let _: Token![,] = input.parse()?; |  | ||||||
|         let id = input.parse()?; |  | ||||||
| 
 |  | ||||||
|         Ok(Self { dollar_crate, id }) |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #[proc_macro] |  | ||||||
| pub fn device_key_id(input: TokenStream) -> TokenStream { |  | ||||||
|     let Input { dollar_crate, id } = parse_macro_input!(input as Input); |  | ||||||
|     assert!(device_key_id::validate(&id.value()).is_ok(), "Invalid device key id"); |  | ||||||
| 
 |  | ||||||
|     let output = quote! { |  | ||||||
|         <&#dollar_crate::DeviceKeyId as ::std::convert::TryFrom<&str>>::try_from(#id).unwrap() |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     output.into() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #[proc_macro] |  | ||||||
| pub fn event_id(input: TokenStream) -> TokenStream { |  | ||||||
|     let Input { dollar_crate, id } = parse_macro_input!(input as Input); |  | ||||||
|     assert!(event_id::validate(&id.value()).is_ok(), "Invalid event id"); |  | ||||||
| 
 |  | ||||||
|     let output = quote! { |  | ||||||
|         <&#dollar_crate::EventId as ::std::convert::TryFrom<&str>>::try_from(#id).unwrap() |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     output.into() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #[proc_macro] |  | ||||||
| pub fn room_alias_id(input: TokenStream) -> TokenStream { |  | ||||||
|     let Input { dollar_crate, id } = parse_macro_input!(input as Input); |  | ||||||
|     assert!(room_alias_id::validate(&id.value()).is_ok(), "Invalid room_alias_id"); |  | ||||||
| 
 |  | ||||||
|     let output = quote! { |  | ||||||
|         <&#dollar_crate::RoomAliasId as ::std::convert::TryFrom<&str>>::try_from(#id).unwrap() |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     output.into() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #[proc_macro] |  | ||||||
| pub fn room_id(input: TokenStream) -> TokenStream { |  | ||||||
|     let Input { dollar_crate, id } = parse_macro_input!(input as Input); |  | ||||||
|     assert!(room_id::validate(&id.value()).is_ok(), "Invalid room_id"); |  | ||||||
| 
 |  | ||||||
|     let output = quote! { |  | ||||||
|         <&#dollar_crate::RoomId as ::std::convert::TryFrom<&str>>::try_from(#id).unwrap() |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     output.into() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #[proc_macro] |  | ||||||
| pub fn room_version_id(input: TokenStream) -> TokenStream { |  | ||||||
|     let Input { dollar_crate, id } = parse_macro_input!(input as Input); |  | ||||||
|     assert!(room_version_id::validate(&id.value()).is_ok(), "Invalid room_version_id"); |  | ||||||
| 
 |  | ||||||
|     let output = quote! { |  | ||||||
|         <#dollar_crate::RoomVersionId as ::std::convert::TryFrom<&str>>::try_from(#id).unwrap() |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     output.into() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #[proc_macro] |  | ||||||
| pub fn server_signing_key_id(input: TokenStream) -> TokenStream { |  | ||||||
|     let Input { dollar_crate, id } = parse_macro_input!(input as Input); |  | ||||||
|     assert!(key_id::validate(&id.value()).is_ok(), "Invalid server_signing_key_id"); |  | ||||||
| 
 |  | ||||||
|     let output = quote! { |  | ||||||
|         <&#dollar_crate::ServerSigningKeyId as ::std::convert::TryFrom<&str>>::try_from(#id).unwrap() |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     output.into() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #[proc_macro] |  | ||||||
| pub fn server_name(input: TokenStream) -> TokenStream { |  | ||||||
|     let Input { dollar_crate, id } = parse_macro_input!(input as Input); |  | ||||||
|     assert!(server_name::validate(&id.value()).is_ok(), "Invalid server_name"); |  | ||||||
| 
 |  | ||||||
|     let output = quote! { |  | ||||||
|         <&#dollar_crate::ServerName as ::std::convert::TryFrom<&str>>::try_from(#id).unwrap() |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     output.into() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #[proc_macro] |  | ||||||
| pub fn mxc_uri(input: TokenStream) -> TokenStream { |  | ||||||
|     let Input { dollar_crate, id } = parse_macro_input!(input as Input); |  | ||||||
|     assert!(mxc_uri::validate(&id.value()).is_ok(), "Invalid mxc://"); |  | ||||||
| 
 |  | ||||||
|     let output = quote! { |  | ||||||
|         <&#dollar_crate::MxcUri as ::std::convert::From<&str>>::from(#id) |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     output.into() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #[proc_macro] |  | ||||||
| pub fn user_id(input: TokenStream) -> TokenStream { |  | ||||||
|     let Input { dollar_crate, id } = parse_macro_input!(input as Input); |  | ||||||
|     assert!(user_id::validate(&id.value()).is_ok(), "Invalid user_id"); |  | ||||||
| 
 |  | ||||||
|     let output = quote! { |  | ||||||
|         <&#dollar_crate::UserId as ::std::convert::TryFrom<&str>>::try_from(#id).unwrap() |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     output.into() |  | ||||||
| } |  | ||||||
| @ -1,6 +1,6 @@ | |||||||
| [package] | [package] | ||||||
| name = "ruma-identifiers-validation" | name = "ruma-identifiers-validation" | ||||||
| description = "Validation logic for ruma-identifiers and ruma-identifiers-macros" | description = "Validation logic for ruma-identifiers and ruma-macros" | ||||||
| homepage = "https://www.ruma.io/" | homepage = "https://www.ruma.io/" | ||||||
| repository = "https://github.com/ruma/ruma" | repository = "https://github.com/ruma/ruma" | ||||||
| license = "MIT" | license = "MIT" | ||||||
|  | |||||||
| @ -24,8 +24,8 @@ serde = ["ruma-serde", "serde1"] | |||||||
| either = { version = "1.6.1", optional = true } | either = { version = "1.6.1", optional = true } | ||||||
| percent-encoding = "2.1.0" | percent-encoding = "2.1.0" | ||||||
| rand_crate = { package = "rand", version = "0.8.3", optional = true } | rand_crate = { package = "rand", version = "0.8.3", optional = true } | ||||||
| ruma-identifiers-macros = { version = "=0.22.0", path = "../ruma-identifiers-macros" } |  | ||||||
| ruma-identifiers-validation = { version = "0.7.0", path = "../ruma-identifiers-validation", default-features = false } | ruma-identifiers-validation = { version = "0.7.0", path = "../ruma-identifiers-validation", default-features = false } | ||||||
|  | ruma-macros = { version = "=0.1.0", path = "../ruma-macros" } | ||||||
| ruma-serde = { version = "0.6.0", path = "../ruma-serde", optional = true } | ruma-serde = { version = "0.6.0", path = "../ruma-serde", optional = true } | ||||||
| ruma-serde-macros = { version = "0.6.0", path = "../ruma-serde-macros" } | ruma-serde-macros = { version = "0.6.0", path = "../ruma-serde-macros" } | ||||||
| # Renamed so we can have a serde feature. | # Renamed so we can have a serde feature. | ||||||
|  | |||||||
| @ -110,7 +110,10 @@ macro_rules! device_id { | |||||||
| // Bug report: https://github.com/rust-lang/rust/issues/83939
 | // Bug report: https://github.com/rust-lang/rust/issues/83939
 | ||||||
| #[doc(hidden)] | #[doc(hidden)] | ||||||
| pub mod _macros { | pub mod _macros { | ||||||
|     pub use ruma_identifiers_macros::*; |     pub use ruma_macros::{ | ||||||
|  |         device_key_id, event_id, mxc_uri, room_alias_id, room_id, room_version_id, server_name, | ||||||
|  |         server_signing_key_id, user_id, | ||||||
|  |     }; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// Compile-time checked `DeviceKeyId` construction.
 | /// Compile-time checked `DeviceKeyId` construction.
 | ||||||
|  | |||||||
| @ -20,4 +20,5 @@ compat = [] | |||||||
| proc-macro-crate = "1.0.0" | proc-macro-crate = "1.0.0" | ||||||
| proc-macro2 = "1.0.24" | proc-macro2 = "1.0.24" | ||||||
| quote = "1.0.8" | quote = "1.0.8" | ||||||
|  | ruma-identifiers-validation = { version = "0.7.0", path = "../ruma-identifiers-validation", default-features = false } | ||||||
| syn = { version = "1.0.57", features = ["extra-traits", "full"] } | syn = { version = "1.0.57", features = ["extra-traits", "full"] } | ||||||
|  | |||||||
							
								
								
									
										20
									
								
								crates/ruma-macros/src/identifiers.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								crates/ruma-macros/src/identifiers.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,20 @@ | |||||||
|  | //! Methods and types for generating [ruma-identifiers].
 | ||||||
|  | //!
 | ||||||
|  | //! [ruma-identifiers]: https://github.com/ruma/ruma/tree/main/ruma-identifiers
 | ||||||
|  | 
 | ||||||
|  | use syn::{parse::Parse, LitStr, Path, Token}; | ||||||
|  | 
 | ||||||
|  | pub struct IdentifierInput { | ||||||
|  |     pub dollar_crate: Path, | ||||||
|  |     pub id: LitStr, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl Parse for IdentifierInput { | ||||||
|  |     fn parse(input: syn::parse::ParseStream<'_>) -> syn::Result<Self> { | ||||||
|  |         let dollar_crate = input.parse()?; | ||||||
|  |         let _: Token![,] = input.parse()?; | ||||||
|  |         let id = input.parse()?; | ||||||
|  | 
 | ||||||
|  |         Ok(Self { dollar_crate, id }) | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -10,17 +10,25 @@ use proc_macro::TokenStream; | |||||||
| use proc_macro2 as pm2; | use proc_macro2 as pm2; | ||||||
| use proc_macro_crate::{crate_name, FoundCrate}; | use proc_macro_crate::{crate_name, FoundCrate}; | ||||||
| use quote::{format_ident, quote}; | use quote::{format_ident, quote}; | ||||||
|  | use ruma_identifiers_validation::{ | ||||||
|  |     device_key_id, event_id, key_id, mxc_uri, room_alias_id, room_id, room_version_id, server_name, | ||||||
|  |     user_id, | ||||||
|  | }; | ||||||
| use syn::{parse_macro_input, DeriveInput}; | use syn::{parse_macro_input, DeriveInput}; | ||||||
| 
 | 
 | ||||||
| use self::events::{ | use self::{ | ||||||
|     event::expand_event, |     events::{ | ||||||
|     event_content::expand_event_content, |         event::expand_event, | ||||||
|     event_enum::{expand_event_enums, expand_from_impls_derived}, |         event_content::expand_event_content, | ||||||
|     event_parse::EventEnumInput, |         event_enum::{expand_event_enums, expand_from_impls_derived}, | ||||||
|     event_type::expand_event_type_enum, |         event_parse::EventEnumInput, | ||||||
|  |         event_type::expand_event_type_enum, | ||||||
|  |     }, | ||||||
|  |     identifiers::IdentifierInput, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| mod events; | mod events; | ||||||
|  | mod identifiers; | ||||||
| 
 | 
 | ||||||
| /// Generates an enum to represent the various Matrix event types.
 | /// Generates an enum to represent the various Matrix event types.
 | ||||||
| ///
 | ///
 | ||||||
| @ -110,3 +118,120 @@ pub fn derive_from_event_to_enum(input: TokenStream) -> TokenStream { | |||||||
|     let input = parse_macro_input!(input as DeriveInput); |     let input = parse_macro_input!(input as DeriveInput); | ||||||
|     expand_from_impls_derived(input).into() |     expand_from_impls_derived(input).into() | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | /// Compile-time checked `DeviceKeyId` construction.
 | ||||||
|  | #[proc_macro] | ||||||
|  | pub fn device_key_id(input: TokenStream) -> TokenStream { | ||||||
|  |     let IdentifierInput { dollar_crate, id } = parse_macro_input!(input as IdentifierInput); | ||||||
|  |     assert!(device_key_id::validate(&id.value()).is_ok(), "Invalid device key id"); | ||||||
|  | 
 | ||||||
|  |     let output = quote! { | ||||||
|  |         <&#dollar_crate::DeviceKeyId as ::std::convert::TryFrom<&str>>::try_from(#id).unwrap() | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     output.into() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /// Compile-time checked `EventId` construction.
 | ||||||
|  | #[proc_macro] | ||||||
|  | pub fn event_id(input: TokenStream) -> TokenStream { | ||||||
|  |     let IdentifierInput { dollar_crate, id } = parse_macro_input!(input as IdentifierInput); | ||||||
|  |     assert!(event_id::validate(&id.value()).is_ok(), "Invalid event id"); | ||||||
|  | 
 | ||||||
|  |     let output = quote! { | ||||||
|  |         <&#dollar_crate::EventId as ::std::convert::TryFrom<&str>>::try_from(#id).unwrap() | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     output.into() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /// Compile-time checked `RoomAliasId` construction.
 | ||||||
|  | #[proc_macro] | ||||||
|  | pub fn room_alias_id(input: TokenStream) -> TokenStream { | ||||||
|  |     let IdentifierInput { dollar_crate, id } = parse_macro_input!(input as IdentifierInput); | ||||||
|  |     assert!(room_alias_id::validate(&id.value()).is_ok(), "Invalid room_alias_id"); | ||||||
|  | 
 | ||||||
|  |     let output = quote! { | ||||||
|  |         <&#dollar_crate::RoomAliasId as ::std::convert::TryFrom<&str>>::try_from(#id).unwrap() | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     output.into() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /// Compile-time checked `RoomId` construction.
 | ||||||
|  | #[proc_macro] | ||||||
|  | pub fn room_id(input: TokenStream) -> TokenStream { | ||||||
|  |     let IdentifierInput { dollar_crate, id } = parse_macro_input!(input as IdentifierInput); | ||||||
|  |     assert!(room_id::validate(&id.value()).is_ok(), "Invalid room_id"); | ||||||
|  | 
 | ||||||
|  |     let output = quote! { | ||||||
|  |         <&#dollar_crate::RoomId as ::std::convert::TryFrom<&str>>::try_from(#id).unwrap() | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     output.into() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /// Compile-time checked `RoomVersionId` construction.
 | ||||||
|  | #[proc_macro] | ||||||
|  | pub fn room_version_id(input: TokenStream) -> TokenStream { | ||||||
|  |     let IdentifierInput { dollar_crate, id } = parse_macro_input!(input as IdentifierInput); | ||||||
|  |     assert!(room_version_id::validate(&id.value()).is_ok(), "Invalid room_version_id"); | ||||||
|  | 
 | ||||||
|  |     let output = quote! { | ||||||
|  |         <#dollar_crate::RoomVersionId as ::std::convert::TryFrom<&str>>::try_from(#id).unwrap() | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     output.into() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /// Compile-time checked `ServerSigningKeyId` construction.
 | ||||||
|  | #[proc_macro] | ||||||
|  | pub fn server_signing_key_id(input: TokenStream) -> TokenStream { | ||||||
|  |     let IdentifierInput { dollar_crate, id } = parse_macro_input!(input as IdentifierInput); | ||||||
|  |     assert!(key_id::validate(&id.value()).is_ok(), "Invalid server_signing_key_id"); | ||||||
|  | 
 | ||||||
|  |     let output = quote! { | ||||||
|  |         <&#dollar_crate::ServerSigningKeyId as ::std::convert::TryFrom<&str>>::try_from(#id).unwrap() | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     output.into() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /// Compile-time checked `ServerName` construction.
 | ||||||
|  | #[proc_macro] | ||||||
|  | pub fn server_name(input: TokenStream) -> TokenStream { | ||||||
|  |     let IdentifierInput { dollar_crate, id } = parse_macro_input!(input as IdentifierInput); | ||||||
|  |     assert!(server_name::validate(&id.value()).is_ok(), "Invalid server_name"); | ||||||
|  | 
 | ||||||
|  |     let output = quote! { | ||||||
|  |         <&#dollar_crate::ServerName as ::std::convert::TryFrom<&str>>::try_from(#id).unwrap() | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     output.into() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /// Compile-time checked `MxcUri` construction.
 | ||||||
|  | #[proc_macro] | ||||||
|  | pub fn mxc_uri(input: TokenStream) -> TokenStream { | ||||||
|  |     let IdentifierInput { dollar_crate, id } = parse_macro_input!(input as IdentifierInput); | ||||||
|  |     assert!(mxc_uri::validate(&id.value()).is_ok(), "Invalid mxc://"); | ||||||
|  | 
 | ||||||
|  |     let output = quote! { | ||||||
|  |         <&#dollar_crate::MxcUri as ::std::convert::From<&str>>::from(#id) | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     output.into() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /// Compile-time checked `UserId` construction.
 | ||||||
|  | #[proc_macro] | ||||||
|  | pub fn user_id(input: TokenStream) -> TokenStream { | ||||||
|  |     let IdentifierInput { dollar_crate, id } = parse_macro_input!(input as IdentifierInput); | ||||||
|  |     assert!(user_id::validate(&id.value()).is_ok(), "Invalid user_id"); | ||||||
|  | 
 | ||||||
|  |     let output = quote! { | ||||||
|  |         <&#dollar_crate::UserId as ::std::convert::TryFrom<&str>>::try_from(#id).unwrap() | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     output.into() | ||||||
|  | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user