From 080cc42bb1da09059dbc35049a7ded0649961e0c Mon Sep 17 00:00:00 2001 From: HampusM Date: Mon, 29 Aug 2022 20:52:56 +0200 Subject: feat: implement async functionality --- src/ptr.rs | 89 ++++++++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 63 insertions(+), 26 deletions(-) (limited to 'src/ptr.rs') diff --git a/src/ptr.rs b/src/ptr.rs index 44fc15c..33f8a95 100644 --- a/src/ptr.rs +++ b/src/ptr.rs @@ -2,10 +2,11 @@ //! Smart pointer type aliases. use std::rc::Rc; +use std::sync::Arc; use paste::paste; -use crate::errors::ptr::SomePtrError; +use crate::errors::ptr::{SomePtrError, SomeThreadsafePtrError}; /// A smart pointer for a interface in the transient scope. pub type TransientPtr = Box; @@ -13,44 +14,34 @@ pub type TransientPtr = Box; /// A smart pointer to a interface in the singleton scope. pub type SingletonPtr = Rc; +/// A threadsafe smart pointer to a interface in the singleton scope. +pub type ThreadsafeSingletonPtr = Arc; + /// A smart pointer to a factory. #[cfg(feature = "factory")] pub type FactoryPtr = Rc; -/// Some smart pointer. -#[derive(strum_macros::IntoStaticStr)] -pub enum SomePtr -where - Interface: 'static + ?Sized, -{ - /// A smart pointer to a interface in the transient scope. - Transient(TransientPtr), - - /// A smart pointer to a interface in the singleton scope. - Singleton(SingletonPtr), - - /// A smart pointer to a factory. - #[cfg(feature = "factory")] - Factory(FactoryPtr), -} +/// A threadsafe smart pointer to a factory. +#[cfg(feature = "factory")] +pub type ThreadsafeFactoryPtr = Arc; macro_rules! create_as_variant_fn { - ($variant: ident) => { + ($enum: ident, $variant: ident) => { paste! { #[doc = - "Returns as " [<$variant:lower>] ".\n" + "Returns as the `" [<$variant>] "` variant.\n" "\n" "# Errors\n" - "Will return Err if it's not a " [<$variant:lower>] "." + "Will return Err if it's not the `" [<$variant>] "` variant." ] - pub fn [<$variant:lower>](self) -> Result<[<$variant Ptr>], SomePtrError> + pub fn [<$variant:snake>](self) -> Result<[<$variant Ptr>], [<$enum Error>]> { - if let SomePtr::$variant(ptr) = self { + if let $enum::$variant(ptr) = self { return Ok(ptr); } - Err(SomePtrError::WrongPtrType { + Err([<$enum Error>]::WrongPtrType { expected: stringify!($variant), found: self.into() }) @@ -59,14 +50,60 @@ macro_rules! create_as_variant_fn { }; } +/// Some smart pointer. +#[derive(strum_macros::IntoStaticStr)] +pub enum SomePtr +where + Interface: 'static + ?Sized, +{ + /// A smart pointer to a interface in the transient scope. + Transient(TransientPtr), + + /// A smart pointer to a interface in the singleton scope. + Singleton(SingletonPtr), + + /// A smart pointer to a factory. + #[cfg(feature = "factory")] + Factory(FactoryPtr), +} + impl SomePtr where Interface: 'static + ?Sized, { - create_as_variant_fn!(Transient); + create_as_variant_fn!(SomePtr, Transient); + + create_as_variant_fn!(SomePtr, Singleton); + + #[cfg(feature = "factory")] + create_as_variant_fn!(SomePtr, Factory); +} + +/// Some threadsafe smart pointer. +#[derive(strum_macros::IntoStaticStr)] +pub enum SomeThreadsafePtr +where + Interface: 'static + ?Sized, +{ + /// A smart pointer to a interface in the transient scope. + Transient(TransientPtr), + + /// A smart pointer to a interface in the singleton scope. + ThreadsafeSingleton(ThreadsafeSingletonPtr), + + /// A smart pointer to a factory. + #[cfg(feature = "factory")] + ThreadsafeFactory(ThreadsafeFactoryPtr), +} + +impl SomeThreadsafePtr +where + Interface: 'static + ?Sized, +{ + create_as_variant_fn!(SomeThreadsafePtr, Transient); - create_as_variant_fn!(Singleton); + create_as_variant_fn!(SomeThreadsafePtr, ThreadsafeSingleton); #[cfg(feature = "factory")] - create_as_variant_fn!(Factory); + create_as_variant_fn!(SomeThreadsafePtr, ThreadsafeFactory); } -- cgit v1.2.3-18-g5258