From 1a0eabe340c915826e4f0bfe1791ed5ede81febb Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 15 Nov 2021 13:42:30 -0800 Subject: [PATCH] add new macro: `pubkey!` (backport #21245) (#21288) --- sdk/macro/src/lib.rs | 42 ++++++++++++++++++++++++++++++++++++++++++ sdk/program/src/lib.rs | 16 ++++++++++++++++ sdk/src/lib.rs | 16 ++++++++++++++++ 3 files changed, 74 insertions(+) diff --git a/sdk/macro/src/lib.rs b/sdk/macro/src/lib.rs index 6715143d45..14e01a25fe 100644 --- a/sdk/macro/src/lib.rs +++ b/sdk/macro/src/lib.rs @@ -63,6 +63,36 @@ fn id_to_tokens( }); } +struct SdkPubkey(proc_macro2::TokenStream); + +impl Parse for SdkPubkey { + fn parse(input: ParseStream) -> Result { + parse_id(input, quote! { ::solana_sdk::pubkey::Pubkey }).map(Self) + } +} + +impl ToTokens for SdkPubkey { + fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) { + let id = &self.0; + tokens.extend(quote! {#id}) + } +} + +struct ProgramSdkPubkey(proc_macro2::TokenStream); + +impl Parse for ProgramSdkPubkey { + fn parse(input: ParseStream) -> Result { + parse_id(input, quote! { ::solana_program::pubkey::Pubkey }).map(Self) + } +} + +impl ToTokens for ProgramSdkPubkey { + fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) { + let id = &self.0; + tokens.extend(quote! {#id}) + } +} + struct Id(proc_macro2::TokenStream); impl Parse for Id { @@ -157,6 +187,18 @@ pub fn respan(input: TokenStream) -> TokenStream { TokenStream::from(to_respan) } +#[proc_macro] +pub fn pubkey(input: TokenStream) -> TokenStream { + let id = parse_macro_input!(input as SdkPubkey); + TokenStream::from(quote! {#id}) +} + +#[proc_macro] +pub fn program_pubkey(input: TokenStream) -> TokenStream { + let id = parse_macro_input!(input as ProgramSdkPubkey); + TokenStream::from(quote! {#id}) +} + #[proc_macro] pub fn declare_id(input: TokenStream) -> TokenStream { let id = parse_macro_input!(input as Id); diff --git a/sdk/program/src/lib.rs b/sdk/program/src/lib.rs index 2cc1ee53d9..a58ad06350 100644 --- a/sdk/program/src/lib.rs +++ b/sdk/program/src/lib.rs @@ -84,6 +84,22 @@ pub mod vote { /// assert_eq!(id(), my_id); /// ``` pub use solana_sdk_macro::program_declare_id as declare_id; +/// Convenience macro to define a static public key +/// +/// Input: a single literal base58 string representation of a Pubkey +/// +/// # Example +/// +/// ``` +/// use std::str::FromStr; +/// use solana_program::{pubkey, pubkey::Pubkey}; +/// +/// static ID: Pubkey = pubkey!("My11111111111111111111111111111111111111111"); +/// +/// let my_id = Pubkey::from_str("My11111111111111111111111111111111111111111").unwrap(); +/// assert_eq!(ID, my_id); +/// ``` +pub use solana_sdk_macro::program_pubkey as pubkey; #[macro_use] extern crate serde_derive; diff --git a/sdk/src/lib.rs b/sdk/src/lib.rs index 11e3189815..f11d04c04c 100644 --- a/sdk/src/lib.rs +++ b/sdk/src/lib.rs @@ -73,6 +73,22 @@ pub mod transport; /// assert_eq!(id(), my_id); /// ``` pub use solana_sdk_macro::declare_id; +/// Convenience macro to define a static public key +/// +/// Input: a single literal base58 string representation of a Pubkey +/// +/// # Example +/// +/// ``` +/// use std::str::FromStr; +/// use solana_program::{pubkey, pubkey::Pubkey}; +/// +/// static ID: Pubkey = pubkey!("My11111111111111111111111111111111111111111"); +/// +/// let my_id = Pubkey::from_str("My11111111111111111111111111111111111111111").unwrap(); +/// assert_eq!(ID, my_id); +/// ``` +pub use solana_sdk_macro::pubkey; pub use solana_sdk_macro::pubkeys; #[rustversion::since(1.46.0)] pub use solana_sdk_macro::respan;