Skip to content

Commit 7e44ae2

Browse files
committed
feat: Add interface builders
1 parent e0777a3 commit 7e44ae2

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
@@ -381,6 +381,79 @@ 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 constant<T: Into<String>>(
408+
mut self,
409+
name: T,
410+
value: impl IntoZval + 'static,
411+
docs: DocComments,
412+
) -> Result<Self> {
413+
self.class_builder = self.class_builder.constant(name, value, docs)?;
414+
415+
Ok(self)
416+
}
417+
418+
pub fn dyn_constant<T: Into<String>>(
419+
mut self,
420+
name: T,
421+
value: &'static dyn IntoZvalDyn,
422+
docs: DocComments,
423+
) -> Result<Self> {
424+
self.class_builder = self.class_builder.dyn_constant(name, value, docs)?;
425+
426+
Ok(self)
427+
}
428+
429+
pub fn flags(mut self, flags: ClassFlags) -> Self {
430+
self.class_builder = self.class_builder.flags(flags);
431+
self
432+
}
433+
434+
pub fn object_override<T: RegisteredClass>(mut self) -> Self {
435+
self.class_builder = self.class_builder.object_override::<T>();
436+
437+
self
438+
}
439+
440+
pub fn registration(mut self, register: fn(&'static mut ClassEntry)) -> Self {
441+
self.class_builder = self.class_builder.registration(register);
442+
443+
self
444+
}
445+
446+
pub fn docs(mut self, docs: DocComments) -> Self {
447+
self.class_builder = self.class_builder.docs(docs);
448+
self
449+
}
450+
451+
pub fn builder(mut self) -> ClassBuilder {
452+
self.class_builder = self.class_builder.flags(ClassFlags::Interface);
453+
self.class_builder
454+
}
455+
}
456+
384457
#[cfg(test)]
385458
mod tests {
386459
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,
@@ -172,6 +173,34 @@ impl ModuleBuilder<'_> {
172173
self
173174
}
174175

176+
pub fn interface<T: RegisteredClass>(mut self) -> Self {
177+
self.classes.push(|| {
178+
let mut builder = InterfaceBuilder::new(T::CLASS_NAME);
179+
for (method, flags) in T::method_builders() {
180+
builder = builder.method(method, flags);
181+
}
182+
for (name, value, docs) in T::constants() {
183+
builder = builder
184+
.dyn_constant(*name, *value, docs)
185+
.expect("Failed to register constant");
186+
}
187+
188+
let mut class_builder = builder.builder();
189+
190+
if let Some(modifier) = T::BUILDER_MODIFIER {
191+
class_builder = modifier(class_builder);
192+
}
193+
194+
class_builder
195+
.object_override::<T>()
196+
.registration(|ce| {
197+
T::get_metadata().set_ce(ce);
198+
})
199+
.docs(T::DOC_COMMENTS)
200+
});
201+
self
202+
}
203+
175204
/// Adds a class to the extension.
176205
///
177206
/// # 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)