1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
use proc_macro::TokenStream; use quote::quote; use ruma_identifiers_validation::{ device_key_id, event_id, room_alias_id, room_id, room_version_id, server_key_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()?; input.parse::<Token![,]>()?; 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_key_id(input: TokenStream) -> TokenStream { let Input { dollar_crate, id } = parse_macro_input!(input as Input); assert!(server_key_id::validate(&id.value()).is_ok(), "Invalid server_key_id"); let output = quote! { <#dollar_crate::ServerKeyId 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! { <::std::boxed::Box::<#dollar_crate::ServerName> as ::std::convert::TryFrom<&str>>::try_from(#id).unwrap() }; 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() }