aboutsummaryrefslogtreecommitdiff
path: root/src/lib.rs
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2022-08-20 17:08:58 +0200
committerHampusM <hampus@hampusmat.com>2022-08-21 18:17:50 +0200
commitb31422d48a600ccccb682567f5eb11fc0bca547c (patch)
treefe3618522478249ef56c955e870e6525053f8ffa /src/lib.rs
parentb749754dc1818a95e0baf0214b969fb99df4e7ab (diff)
feat: allow bind interface to default factory
This commit will allow interface traits to be bound to default factories. Default factories being factories that doesn't take any arguments
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 89688f1..78506bc 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -45,3 +45,70 @@ macro_rules! di_container_bind {
syrette::declare_interface!($implementation -> $interface);
};
}
+
+/// Shortcut for declaring a default factory.
+///
+/// A default factory is a factory that doesn't take any arguments.
+///
+/// More tedious ways to accomplish what this macro does would either be by using
+/// the [`factory`] macro or by manually declaring the interfaces
+/// with the [`declare_interface`] macro.
+///
+/// *This macro is only available if Syrette is built with the "factory" feature.*
+///
+/// # Arguments
+/// - Interface trait
+///
+/// # Examples
+/// ```
+/// use syrette::declare_default_factory;
+///
+/// trait IParser {
+/// // Methods and etc here...
+/// }
+///
+/// declare_default_factory!(IParser);
+/// ```
+///
+/// The expanded equivelent of this would be
+///
+/// ```
+/// use syrette::declare_default_factory;
+///
+/// trait IParser {
+/// // Methods and etc here...
+/// }
+///
+/// syrette::declare_interface!(
+/// syrette::castable_factory::CastableFactory<
+/// (),
+/// dyn IParser,
+/// > -> syrette::interfaces::factory::IFactory<(), dyn IParser>
+/// );
+///
+/// syrette::declare_interface!(
+/// syrette::castable_factory::CastableFactory<
+/// (),
+/// dyn IParser,
+/// > -> syrette::interfaces::any_factory::AnyFactory
+/// );
+/// ```
+#[macro_export]
+#[cfg(feature = "factory")]
+macro_rules! declare_default_factory {
+ ($interface: path) => {
+ syrette::declare_interface!(
+ syrette::castable_factory::CastableFactory<
+ (),
+ dyn $interface,
+ > -> syrette::interfaces::factory::IFactory<(), dyn $interface>
+ );
+
+ syrette::declare_interface!(
+ syrette::castable_factory::CastableFactory<
+ (),
+ dyn $interface,
+ > -> syrette::interfaces::any_factory::AnyFactory
+ );
+ }
+}