From c66bc5da47b0373f2f79a6a078cda03e368da6f5 Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Mon, 30 Jun 2025 16:59:25 -0400 Subject: [PATCH] feat!: rename contract-trait-macro to contracttrait-macro --- admin/Cargo.lock | 4 +- admin_sep/Cargo.lock | 4 +- admin_sep/Cargo.toml | 2 +- admin_sep/src/administratable.rs | 2 +- admin_sep/src/lib.rs | 2 +- admin_sep/src/upgradable.rs | 2 +- contract-trait-macro/src/lib.rs | 37 -------- .../Cargo.lock | 2 +- .../Cargo.toml | 2 +- .../README.md | 0 .../src/args.rs | 0 .../src/contracttrait.rs | 0 .../src/error.rs | 0 contracttrait-macro/src/lib.rs | 91 +++++++++++++++++++ .../src/util.rs | 0 15 files changed, 101 insertions(+), 47 deletions(-) delete mode 100644 contract-trait-macro/src/lib.rs rename {contract-trait-macro => contracttrait-macro}/Cargo.lock (99%) rename {contract-trait-macro => contracttrait-macro}/Cargo.toml (96%) rename {contract-trait-macro => contracttrait-macro}/README.md (100%) rename {contract-trait-macro => contracttrait-macro}/src/args.rs (100%) rename {contract-trait-macro => contracttrait-macro}/src/contracttrait.rs (100%) rename {contract-trait-macro => contracttrait-macro}/src/error.rs (100%) create mode 100644 contracttrait-macro/src/lib.rs rename {contract-trait-macro => contracttrait-macro}/src/util.rs (100%) diff --git a/admin/Cargo.lock b/admin/Cargo.lock index 8267e9b..a67a356 100644 --- a/admin/Cargo.lock +++ b/admin/Cargo.lock @@ -12,7 +12,7 @@ checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" name = "admin-sep" version = "0.0.0" dependencies = [ - "contract-trait-macro", + "contracttrait-macro", "soroban-sdk", ] @@ -292,7 +292,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] -name = "contract-trait-macro" +name = "contracttrait-macro" version = "0.8.6" dependencies = [ "Inflector", diff --git a/admin_sep/Cargo.lock b/admin_sep/Cargo.lock index fecdb1b..b13208e 100644 --- a/admin_sep/Cargo.lock +++ b/admin_sep/Cargo.lock @@ -12,7 +12,7 @@ checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" name = "admin-sep" version = "0.0.0" dependencies = [ - "contract-trait-macro", + "contracttrait-macro", "soroban-sdk", ] @@ -292,7 +292,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] -name = "contract-trait-macro" +name = "contracttrait-macro" version = "0.8.6" dependencies = [ "Inflector", diff --git a/admin_sep/Cargo.toml b/admin_sep/Cargo.toml index 401dccc..8a1854f 100644 --- a/admin_sep/Cargo.toml +++ b/admin_sep/Cargo.toml @@ -11,7 +11,7 @@ doctest = false [dependencies] soroban-sdk = { version = "22.0.7" } -contract-trait-macro = { path = "../contract-trait-macro" } +contracttrait-macro = { path = "../contracttrait-macro" } [dev-dependencies] soroban-sdk = { version = "22.0.7", features = ["testutils"] } diff --git a/admin_sep/src/administratable.rs b/admin_sep/src/administratable.rs index 40828ff..1bf87b2 100644 --- a/admin_sep/src/administratable.rs +++ b/admin_sep/src/administratable.rs @@ -1,4 +1,4 @@ -use contract_trait_macro::contracttrait; +use crate::contracttrait; use soroban_sdk::{Address, Env, Symbol, symbol_short}; /// Trait for using an admin address to control access. diff --git a/admin_sep/src/lib.rs b/admin_sep/src/lib.rs index 7fd550e..b2c3f05 100644 --- a/admin_sep/src/lib.rs +++ b/admin_sep/src/lib.rs @@ -1,5 +1,5 @@ #![no_std] -pub use contract_trait_macro::*; +pub use contracttrait_macro::*; mod administratable; mod constructor; diff --git a/admin_sep/src/upgradable.rs b/admin_sep/src/upgradable.rs index ed04a03..81489a2 100644 --- a/admin_sep/src/upgradable.rs +++ b/admin_sep/src/upgradable.rs @@ -1,4 +1,4 @@ -use contract_trait_macro::contracttrait; +use crate::contracttrait; use crate::administratable::{Administratable, AdministratableExt}; diff --git a/contract-trait-macro/src/lib.rs b/contract-trait-macro/src/lib.rs deleted file mode 100644 index d7eb375..0000000 --- a/contract-trait-macro/src/lib.rs +++ /dev/null @@ -1,37 +0,0 @@ -#![recursion_limit = "128"] -extern crate proc_macro; - -use proc_macro::TokenStream; - -mod args; -mod contracttrait; -mod error; -mod util; - -/// Generates a macro_rules macro that generates a external implementation of the trait for the contract -/// -/// -/// # Panics -/// -/// This macro will panic if: -/// - The input `TokenStream` cannot be parsed into a valid Rust item. -/// - The `contracttrait::generate` function fails to generate the companion trait. -/// -#[proc_macro_attribute] -pub fn contracttrait(attr: TokenStream, item: TokenStream) -> TokenStream { - let (parsed_args, parsed) = match args::parse(attr, item) { - Ok((args, item)) => (args, item), - Err(e) => return Into::::into(e).into(), - }; - contracttrait::generate(&parsed_args, &parsed).into() -} - -/// Derives a contract trait for the given Contract struct. -#[proc_macro_attribute] -pub fn derive_contract(attr: TokenStream, item: TokenStream) -> TokenStream { - let (parsed_args, parsed) = match args::parse(attr, item) { - Ok((args, item)) => (args, item), - Err(e) => return Into::::into(e).into(), - }; - contracttrait::derive_contract(&parsed_args, &parsed).into() -} diff --git a/contract-trait-macro/Cargo.lock b/contracttrait-macro/Cargo.lock similarity index 99% rename from contract-trait-macro/Cargo.lock rename to contracttrait-macro/Cargo.lock index 37b3640..052a89d 100644 --- a/contract-trait-macro/Cargo.lock +++ b/contracttrait-macro/Cargo.lock @@ -76,7 +76,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" [[package]] -name = "contract-trait-macro" +name = "contracttrait-macro" version = "0.8.6" dependencies = [ "Inflector", diff --git a/contract-trait-macro/Cargo.toml b/contracttrait-macro/Cargo.toml similarity index 96% rename from contract-trait-macro/Cargo.toml rename to contracttrait-macro/Cargo.toml index b61108e..79d3c93 100644 --- a/contract-trait-macro/Cargo.toml +++ b/contracttrait-macro/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "contract-trait-macro" +name = "contracttrait-macro" version = "0.8.6" edition = "2021" description = "Macros needed by loam-sdk" diff --git a/contract-trait-macro/README.md b/contracttrait-macro/README.md similarity index 100% rename from contract-trait-macro/README.md rename to contracttrait-macro/README.md diff --git a/contract-trait-macro/src/args.rs b/contracttrait-macro/src/args.rs similarity index 100% rename from contract-trait-macro/src/args.rs rename to contracttrait-macro/src/args.rs diff --git a/contract-trait-macro/src/contracttrait.rs b/contracttrait-macro/src/contracttrait.rs similarity index 100% rename from contract-trait-macro/src/contracttrait.rs rename to contracttrait-macro/src/contracttrait.rs diff --git a/contract-trait-macro/src/error.rs b/contracttrait-macro/src/error.rs similarity index 100% rename from contract-trait-macro/src/error.rs rename to contracttrait-macro/src/error.rs diff --git a/contracttrait-macro/src/lib.rs b/contracttrait-macro/src/lib.rs new file mode 100644 index 0000000..93abb15 --- /dev/null +++ b/contracttrait-macro/src/lib.rs @@ -0,0 +1,91 @@ +#![recursion_limit = "128"] +extern crate proc_macro; + +use proc_macro::TokenStream; + +mod args; +mod contracttrait; +mod error; +mod util; + +/// # Creates a Contract Trait +/// +/// A contract trait is defines an interface of a contract and declaritive macro with the same name. +/// +/// When writing a soroban contract, you must expose a methods in an implementation with `#[contractimpl]`. +/// This works for implementations of traits, but the implementation must define all methods of the trait. +/// +/// For example, consider the following trait and a default implementation: +/// +/// ```ignore +/// trait Administratable { +/// fn admin(env: &Env) -> Address; +/// fn set_admin(env: &Env, new_admin: &Address); +/// } +/// +/// struct Admin; +/// impl Administratable for Admin { +/// fn admin(env: &Env) -> Address { +/// //... +/// +/// } +/// +/// #[contract] +/// pub struct Contract; +/// #[contractimpl] +/// impl Administratable Contract { +/// fn admin(env: &Env) -> Address { +/// Admin::admin(env) +/// } +/// fn set_admin(env: &Env, new_admin: &Address) { +/// Admin::set_admin(env, new_admin); +/// } +/// } +/// ``` +/// +/// Now this works, but it is not very convenient and is very verbose. +/// One way to make this more convenient is to use an associated type in the trait: +/// +/// ```ignore +/// trait Administratable { +/// type Impl: Administratable; +/// fn admin(env: &Env) -> Address { +/// Self::Impl::admin(env)} +/// } +/// fn set_admin(env: &Env, new_admin: &Address) { +/// Self::Impl::set_admin(env, new_admin); +/// } +/// } +/// ``` +/// +/// +/// # Panics +/// +/// This macro will panic if: +/// - The input `TokenStream` cannot be parsed into a valid Rust item. +/// - The `contracttrait::generate` function fails to generate the companion trait. +/// +#[proc_macro_attribute] +pub fn contracttrait(attr: TokenStream, item: TokenStream) -> TokenStream { + let (parsed_args, parsed) = match args::parse(attr, item) { + Ok((args, item)) => (args, item), + Err(e) => return Into::::into(e).into(), + }; + contracttrait::generate(&parsed_args, &parsed).into() +} + +/// Derives a contract trait for the given Contract struct. +/// +/// ```ignore +/// #[contract] +/// #[derive_contract(Administratable, Upgradable(ext = AdministratableExt))] +/// pub struct Contract; +/// ``` +#[proc_macro_attribute] +pub fn derive_contract(attr: TokenStream, item: TokenStream) -> TokenStream { + let (parsed_args, parsed) = match args::parse(attr, item) { + Ok((args, item)) => (args, item), + Err(e) => return Into::::into(e).into(), + }; + contracttrait::derive_contract(&parsed_args, &parsed).into() +} diff --git a/contract-trait-macro/src/util.rs b/contracttrait-macro/src/util.rs similarity index 100% rename from contract-trait-macro/src/util.rs rename to contracttrait-macro/src/util.rs