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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
// macros.rs
//! Macros for conditional PyO3 bindings.
//!
//! These macros allow defining Python bindings that are only compiled
//! when the `python` feature is enabled. When disabled, the code compiles
//! as plain Rust without any PyO3 dependency.
//!
//! # Usage
//!
//! ```ignore
//! use rowl::macros::impl_python;
//!
//! impl_python! {
//! #[pymethods]
//! impl MyStruct {
//! #[new]
//! pub fn new(name: String, value: i64) -> Self {
//! Self { name, value }
//! }
//!
//! #[getter]
//! pub fn display_name(&self) -> String {
//! format!("{}: {}", self.name, self.value)
//! }
//!
//! fn __repr__(&self) -> String {
//! format!("MyStruct('{}', {})", self.name, self.value)
//! }
//! }
//! }
//! ```
// ============================================================================
// impl_python!: Conditional PyO3 impl blocks
// ============================================================================
/// Define an impl block with conditional PyO3 method attributes.
///
/// When `feature = "python"` is enabled, the first `#[...]` attribute
/// (e.g. `#[pymethods]`) is applied, and inner method attributes like
/// `#[new]`, `#[getter]`, `#[staticmethod]` are preserved.
///
/// When disabled, the outer attribute is stripped and inner PyO3-specific
/// attributes are silently removed, yielding plain Rust methods.
///
/// # Example
///
/// ```rust,ignore
/// impl_python! {
/// #[pymethods]
/// impl QualifiedName {
/// #[new]
/// pub fn new(parts: Vec<String>) -> Self {
/// Self { parts }
/// }
///
/// #[staticmethod]
/// pub fn from_single(name: String) -> Self {
/// Self { parts: vec![name] }
/// }
///
/// #[getter]
/// pub fn full(&self) -> String {
/// self.parts.join(".")
/// }
///
/// fn __repr__(&self) -> String {
/// format!("QualifiedName('{}')", self.full())
/// }
/// }
/// }
/// ```
///
/// # Supported signatures
///
/// - Associated functions: `fn name(arg: Type) -> Ret { ... }`
/// - Methods with `&self`: `fn name(&self, arg: Type) -> Ret { ... }`
/// - Methods with `&mut self`: `fn name(&mut self, arg: Type) -> Ret { ... }`
/// - PyO3 signature attribute: `#[pyo3(signature = (...))]`
) => ;
}
) => ;
}
// ============================================================================
// py_only!: Conditionally includes content only when Python feature is active
// ============================================================================
pub use py_only;
// ============================================================================
// Re-exports
// ============================================================================
pub use impl_python;