Skip to content

Commit 9ed4ad8

Browse files
committed
feat: Add interface builders
1 parent 27d96cd commit 9ed4ad8

File tree

3 files changed

+106
-4
lines changed

3 files changed

+106
-4
lines changed

src/builders/class.rs

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,79 @@ impl ClassBuilder {
386386
}
387387
}
388388

389+
pub struct InterfaceBuilder {
390+
class_builder: ClassBuilder,
391+
}
392+
393+
impl InterfaceBuilder {
394+
pub fn new<T: Into<String>>(name: T) -> Self {
395+
Self {
396+
class_builder: ClassBuilder::new(name),
397+
}
398+
}
399+
400+
pub fn implements(mut self, interface: ClassEntryInfo) -> Self {
401+
self.class_builder = self.class_builder.implements(interface);
402+
403+
self
404+
}
405+
406+
pub fn method(mut self, func: FunctionBuilder<'static>, flags: MethodFlags) -> Self {
407+
self.class_builder = self.class_builder.method(func, flags);
408+
409+
self
410+
}
411+
412+
pub fn constant<T: Into<String>>(
413+
mut self,
414+
name: T,
415+
value: impl IntoZval + 'static,
416+
docs: DocComments,
417+
) -> Result<Self> {
418+
self.class_builder = self.class_builder.constant(name, value, docs)?;
419+
420+
Ok(self)
421+
}
422+
423+
pub fn dyn_constant<T: Into<String>>(
424+
mut self,
425+
name: T,
426+
value: &'static dyn IntoZvalDyn,
427+
docs: DocComments,
428+
) -> Result<Self> {
429+
self.class_builder = self.class_builder.dyn_constant(name, value, docs)?;
430+
431+
Ok(self)
432+
}
433+
434+
pub fn flags(mut self, flags: ClassFlags) -> Self {
435+
self.class_builder = self.class_builder.flags(flags);
436+
self
437+
}
438+
439+
pub fn object_override<T: RegisteredClass>(mut self) -> Self {
440+
self.class_builder = self.class_builder.object_override::<T>();
441+
442+
self
443+
}
444+
445+
pub fn registration(mut self, register: fn(&'static mut ClassEntry)) -> Self {
446+
self.class_builder = self.class_builder.registration(register);
447+
448+
self
449+
}
450+
451+
pub fn docs(mut self, docs: DocComments) -> Self {
452+
self.class_builder = self.class_builder.docs(docs);
453+
self
454+
}
455+
456+
pub fn builder(mut self) -> ClassBuilder {
457+
self.class_builder = self.class_builder.flags(ClassFlags::Interface);
458+
self.class_builder
459+
}
460+
}
461+
389462
#[cfg(test)]
390463
mod tests {
391464
use crate::test::test_function;

src/builders/module.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use super::{ClassBuilder, FunctionBuilder};
44
#[cfg(feature = "enum")]
55
use crate::{builders::enum_builder::EnumBuilder, enum_::RegisteredEnum};
66
use crate::{
7+
builders::class::InterfaceBuilder,
78
class::RegisteredClass,
89
constant::IntoConst,
910
describe::DocComments,
@@ -192,6 +193,34 @@ impl ModuleBuilder<'_> {
192193
self
193194
}
194195

196+
pub fn interface<T: RegisteredClass>(mut self) -> Self {
197+
self.classes.push(|| {
198+
let mut builder = InterfaceBuilder::new(T::CLASS_NAME);
199+
for (method, flags) in T::method_builders() {
200+
builder = builder.method(method, flags);
201+
}
202+
for (name, value, docs) in T::constants() {
203+
builder = builder
204+
.dyn_constant(*name, *value, docs)
205+
.expect("Failed to register constant");
206+
}
207+
208+
let mut class_builder = builder.builder();
209+
210+
if let Some(modifier) = T::BUILDER_MODIFIER {
211+
class_builder = modifier(class_builder);
212+
}
213+
214+
class_builder
215+
.object_override::<T>()
216+
.registration(|ce| {
217+
T::get_metadata().set_ce(ce);
218+
})
219+
.docs(T::DOC_COMMENTS)
220+
});
221+
self
222+
}
223+
195224
/// Adds a class to the extension.
196225
///
197226
/// # Panics

src/lib.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ pub mod prelude {
5555
pub use crate::php_println;
5656
pub use crate::types::ZendCallable;
5757
pub use crate::{
58-
php_class, php_const, php_extern, php_function, php_impl, php_module, wrap_constant,
59-
wrap_function, zend_fastcall, ZvalConvert,
58+
php_class, php_const, php_extern, php_function, php_impl, php_interface, php_module,
59+
wrap_constant, wrap_function, zend_fastcall, ZvalConvert,
6060
};
6161
}
6262

@@ -72,6 +72,6 @@ pub const PHP_ZTS: bool = cfg!(php_zts);
7272
#[cfg(feature = "enum")]
7373
pub use ext_php_rs_derive::php_enum;
7474
pub use ext_php_rs_derive::{
75-
php_class, php_const, php_extern, php_function, php_impl, php_module, wrap_constant,
76-
wrap_function, zend_fastcall, ZvalConvert,
75+
php_class, php_const, php_extern, php_function, php_impl, php_interface, php_module,
76+
wrap_constant, wrap_function, zend_fastcall, ZvalConvert,
7777
};

0 commit comments

Comments
 (0)