From c637ad2d760824f7b430e51de16258c15d3135eb Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 8 Jul 2026 17:30:52 -0400 Subject: [PATCH] chore: initial draft of proc macros --- Cargo.lock | 29 +++++++++++++++++++++++------ Cargo.toml | 2 ++ python-utils-macros-impl/Cargo.toml | 9 +++++++++ python-utils-macros-impl/src/lib.rs | 17 +++++++++++++++++ python-utils-macros/Cargo.toml | 11 +++++++++++ python-utils-macros/src/lib.rs | 6 ++++++ python-utils/Cargo.toml | 1 + python-utils/src/lib.rs | 2 ++ 8 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 python-utils-macros-impl/Cargo.toml create mode 100644 python-utils-macros-impl/src/lib.rs create mode 100644 python-utils-macros/Cargo.toml create mode 100644 python-utils-macros/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 9ed17c3..2e7f101 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1634,9 +1634,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.103" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] @@ -1736,9 +1736,26 @@ version = "0.1.0" dependencies = [ "derive_more", "pyo3", + "python-utils-macros", "snafu", ] +[[package]] +name = "python-utils-macros" +version = "0.1.0" +dependencies = [ + "python-utils-macros-impl", +] + +[[package]] +name = "python-utils-macros-impl" +version = "0.1.0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "quick_cache" version = "0.6.18" @@ -1751,9 +1768,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.42" +version = "1.0.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" dependencies = [ "proc-macro2", ] @@ -2198,9 +2215,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.111" +version = "2.0.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" +checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index fdf584f..284fc1c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,8 @@ members = [ "persisted", "protocol", "python-utils", + "python-utils-macros", + "python-utils-macros-impl", ] resolver = "2" diff --git a/python-utils-macros-impl/Cargo.toml b/python-utils-macros-impl/Cargo.toml new file mode 100644 index 0000000..846b0dd --- /dev/null +++ b/python-utils-macros-impl/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "python-utils-macros-impl" +version = "0.1.0" +edition = "2024" + +[dependencies] +proc-macro2 = "1.0.106" +quote = "1.0.46" +syn = "2.0.118" diff --git a/python-utils-macros-impl/src/lib.rs b/python-utils-macros-impl/src/lib.rs new file mode 100644 index 0000000..08e9809 --- /dev/null +++ b/python-utils-macros-impl/src/lib.rs @@ -0,0 +1,17 @@ +use proc_macro2::TokenStream; +use quote::quote; +use syn::{DeriveInput, parse_macro_input}; + +pub fn py_from_str(input: TokenStream) -> TokenStream { + let derive_input: DeriveInput = parse_macro_input!(input); + + let (impl_generics, ty_generics, where_clause) = generics.split_for_impl(); + + let expanded = quote! { + impl #impl_generics MyTrait for #name #ty_generics #where_clause { + // ... + } + }; + + expanded +} diff --git a/python-utils-macros/Cargo.toml b/python-utils-macros/Cargo.toml new file mode 100644 index 0000000..4f0319c --- /dev/null +++ b/python-utils-macros/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "python-utils-macros" +version = "0.1.0" +edition = "2024" +license.workspace = true + +[lib] +proc-macro = true + +[dependencies] +python-utils-macros-impl = { path = "../python-utils-macros-impl" } diff --git a/python-utils-macros/src/lib.rs b/python-utils-macros/src/lib.rs new file mode 100644 index 0000000..cd12e85 --- /dev/null +++ b/python-utils-macros/src/lib.rs @@ -0,0 +1,6 @@ +use proc_macro::proc_macro_derive; + +#[proc_macro_derive(PyFromStr)] +pub fn py_from_str(input: TokenStream) -> TokenStream { + python_utils_macros_impl::py_from_str(input.into()).into() +} diff --git a/python-utils/Cargo.toml b/python-utils/Cargo.toml index 3726a7f..45b279f 100644 --- a/python-utils/Cargo.toml +++ b/python-utils/Cargo.toml @@ -7,4 +7,5 @@ license = { workspace = true } [dependencies] derive_more = { workspace = true } pyo3 = { workspace = true } +python-utils-macros = { path = "../python-utils-macros" } snafu = { workspace = true } diff --git a/python-utils/src/lib.rs b/python-utils/src/lib.rs index a6319d2..9e07b86 100644 --- a/python-utils/src/lib.rs +++ b/python-utils/src/lib.rs @@ -7,6 +7,8 @@ use pyo3::{ }; use snafu::{ResultExt, Snafu}; +pub use python_utils_macros::PyFromStr; + pub mod none; pub use none::IsNone;