Skip to content

Commit 4d782e1

Browse files
committed
feat: Change const registration for interface
1 parent d7f5ddb commit 4d782e1

File tree

7 files changed

+83
-87
lines changed

7 files changed

+83
-87
lines changed

crates/macros/src/interface.rs

Lines changed: 30 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -34,48 +34,9 @@ pub fn parser(mut input: ItemTrait) -> Result<TokenStream> {
3434
let name = attr.rename.rename(ident.to_string(), RenameRule::Pascal);
3535
input.attrs.clean_php();
3636

37-
let methods: Vec<FnBuilder> = input
38-
.items
39-
.iter_mut()
40-
.flat_map(|item: &mut TraitItem| match item {
41-
TraitItem::Fn(f) => Some(f),
42-
_ => None,
43-
})
44-
.flat_map(|f| f.parse())
45-
.collect();
46-
47-
let constants: Vec<_> = input
48-
.items
49-
.iter_mut()
50-
.flat_map(|item: &mut TraitItem| match item {
51-
TraitItem::Const(c) => Some(c),
52-
_ => None,
53-
})
54-
.flat_map(|c| c.parse())
55-
.map(|c| {
56-
let name = &c.name;
57-
let ident = c.ident;
58-
let docs = &c.docs;
59-
quote! {
60-
(#name, &#path::#ident, &[#(#docs),*])
61-
}
62-
})
63-
.collect();
37+
let methods: Vec<FnBuilder> = input.parse()?;
6438

65-
let impl_const: Vec<&TraitItemConst> = input
66-
.items
67-
.iter()
68-
.flat_map(|item| match item {
69-
TraitItem::Const(c) => Some(c),
70-
_ => None,
71-
})
72-
.flat_map(|c| {
73-
if c.default.is_none() {
74-
bail!("Interface const cannot be empty");
75-
}
76-
Ok(c)
77-
})
78-
.collect();
39+
let constants: Vec<Constant> = input.parse()?;
7940

8041
let implements = attr.extends;
8142

@@ -84,10 +45,6 @@ pub fn parser(mut input: ItemTrait) -> Result<TokenStream> {
8445

8546
pub struct #interface_name;
8647

87-
impl #interface_name {
88-
#(pub #impl_const)*
89-
}
90-
9148
impl ::ext_php_rs::class::RegisteredClass for #interface_name {
9249
const CLASS_NAME: &'static str = #name;
9350

@@ -153,7 +110,7 @@ pub fn parser(mut input: ItemTrait) -> Result<TokenStream> {
153110
}
154111

155112
fn get_constants(self) -> &'static [(&'static str, &'static dyn ::ext_php_rs::convert::IntoZvalDyn, &'static [&'static str])] {
156-
&[#(#constants),*]
113+
&[]
157114
}
158115
}
159116

@@ -242,6 +199,33 @@ trait Parse<'a, T> {
242199
fn parse(&'a mut self) -> Result<T>;
243200
}
244201

202+
impl<'a> Parse<'a, Vec<FnBuilder>> for ItemTrait {
203+
fn parse(&'a mut self) -> Result<Vec<FnBuilder>> {
204+
Ok(self
205+
.items
206+
.iter_mut()
207+
.filter_map(|item: &mut TraitItem| match item {
208+
TraitItem::Fn(f) => Some(f),
209+
_ => None,
210+
})
211+
.flat_map(Parse::parse)
212+
.collect())
213+
}
214+
}
215+
216+
impl<'a> Parse<'a, Vec<Constant<'a>>> for ItemTrait {
217+
fn parse(&'a mut self) -> Result<Vec<Constant<'a>>> {
218+
Ok(self.items
219+
.iter_mut()
220+
.filter_map(|item: &mut TraitItem| match item {
221+
TraitItem::Const(c) => Some(c),
222+
_ => None,
223+
})
224+
.flat_map(Parse::parse)
225+
.collect())
226+
}
227+
}
228+
245229
impl<'a> Parse<'a, Constant<'a>> for TraitItemConst {
246230
fn parse(&'a mut self) -> Result<Constant<'a>> {
247231
let attr = PhpConstAttribute::from_attributes(&self.attrs)?;

src/builders/class.rs

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -381,46 +381,6 @@ impl ClassBuilder {
381381
}
382382
}
383383

384-
pub struct InterfaceBuilder {
385-
class_builder: ClassBuilder,
386-
}
387-
388-
impl InterfaceBuilder {
389-
pub fn new<T: Into<String>>(name: T) -> Self {
390-
Self {
391-
class_builder: ClassBuilder::new(name),
392-
}
393-
}
394-
395-
pub fn implements(mut self, interface: ClassEntryInfo) -> Self {
396-
self.class_builder = self.class_builder.implements(interface);
397-
398-
self
399-
}
400-
401-
pub fn method(mut self, func: FunctionBuilder<'static>, flags: MethodFlags) -> Self {
402-
self.class_builder = self.class_builder.method(func, flags);
403-
404-
self
405-
}
406-
407-
pub fn dyn_constant<T: Into<String>>(
408-
mut self,
409-
name: T,
410-
value: &'static dyn IntoZvalDyn,
411-
docs: DocComments,
412-
) -> Result<Self> {
413-
self.class_builder = self.class_builder.dyn_constant(name, value, docs)?;
414-
415-
Ok(self)
416-
}
417-
418-
pub fn builder(mut self) -> ClassBuilder {
419-
self.class_builder = self.class_builder.flags(ClassFlags::Interface);
420-
self.class_builder
421-
}
422-
}
423-
424384
#[cfg(test)]
425385
mod tests {
426386
use crate::test::test_function;

src/builders/interface.rs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
use crate::builders::FunctionBuilder;
2+
use crate::flags::{ClassFlags, MethodFlags};
3+
use crate::{builders::ClassBuilder, class::ClassEntryInfo, convert::IntoZvalDyn, describe::DocComments};
4+
use crate::error::Result;
5+
6+
pub struct InterfaceBuilder {
7+
class_builder: ClassBuilder,
8+
}
9+
10+
impl InterfaceBuilder {
11+
pub fn new<T: Into<String>>(name: T) -> Self {
12+
Self {
13+
class_builder: ClassBuilder::new(name),
14+
}
15+
}
16+
17+
pub fn implements(mut self, interface: ClassEntryInfo) -> Self {
18+
self.class_builder = self.class_builder.implements(interface);
19+
20+
self
21+
}
22+
23+
pub fn method(mut self, func: FunctionBuilder<'static>, flags: MethodFlags) -> Self {
24+
self.class_builder = self.class_builder.method(func, flags);
25+
26+
self
27+
}
28+
29+
pub fn dyn_constant<T: Into<String>>(
30+
mut self,
31+
name: T,
32+
value: &'static dyn IntoZvalDyn,
33+
docs: DocComments,
34+
) -> Result<Self> {
35+
self.class_builder = self.class_builder.dyn_constant(name, value, docs)?;
36+
37+
Ok(self)
38+
}
39+
40+
pub fn builder(mut self) -> ClassBuilder {
41+
self.class_builder = self.class_builder.flags(ClassFlags::Interface);
42+
self.class_builder
43+
}
44+
}
45+

src/builders/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ mod class;
55
#[cfg(feature = "enum")]
66
mod enum_builder;
77
mod function;
8+
mod interface;
89
#[cfg(all(php82, feature = "embed"))]
910
mod ini;
1011
mod module;

src/builders/module.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::{convert::TryFrom, ffi::CString, mem, ptr};
22

33
use super::{ClassBuilder, FunctionBuilder};
44
use crate::{
5-
builders::class::InterfaceBuilder,
5+
builders::interface::InterfaceBuilder,
66
class::RegisteredClass,
77
constant::IntoConst,
88
describe::DocComments,

src/interface.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
use crate::{convert::IntoZval, describe::DocComments};
2+
3+
pub trait RegisteredInterface {
4+
fn constants() -> &'static [(&'static str, &'static impl IntoZval, DocComments)];
5+
}

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ pub mod flags;
2121
pub mod macros;
2222
pub mod boxed;
2323
pub mod class;
24+
pub mod interface;
2425
#[cfg(any(docs, feature = "closure"))]
2526
#[cfg_attr(docs, doc(cfg(feature = "closure")))]
2627
pub mod closure;

0 commit comments

Comments
 (0)