pub struct GenericCrudService<E, C, U, R>{ /* private fields */ }Expand description
A fully generic CRUD service.
Type parameters:
E— entity type (must implementPersistentEntity)C— create DTO (entity implementsFromCreateDto<C>)U— update DTO (entity implementsApplyUpdateDto<U>)R— repository (implementsCrudRepository<E>)
The service always holds an Arc<dyn CrudEventPublisher<E>>. When no
publisher is needed, NoOpCrudEventPublisher is used (zero overhead).
Event-publish errors are fire-and-forget — they never fail the operation.
Implementations§
Source§impl<E, C, U, R> GenericCrudService<E, C, U, R>where
E: PersistentEntity + Clone + FromCreateDto<C> + ApplyUpdateDto<U>,
C: Send + Sync + 'static,
U: Send + Sync + 'static,
R: CrudRepository<E>,
impl<E, C, U, R> GenericCrudService<E, C, U, R>where
E: PersistentEntity + Clone + FromCreateDto<C> + ApplyUpdateDto<U>,
C: Send + Sync + 'static,
U: Send + Sync + 'static,
R: CrudRepository<E>,
Sourcepub fn new(
repository: Arc<R>,
lifecycle: Arc<dyn ServiceLifecycle<E>>,
event_publisher: Arc<dyn CrudEventPublisher<E>>,
) -> Self
pub fn new( repository: Arc<R>, lifecycle: Arc<dyn ServiceLifecycle<E>>, event_publisher: Arc<dyn CrudEventPublisher<E>>, ) -> Self
Full constructor — supply all three dependencies.
Sourcepub fn with_lifecycle(
repository: Arc<R>,
lifecycle: Arc<dyn ServiceLifecycle<E>>,
) -> Self
pub fn with_lifecycle( repository: Arc<R>, lifecycle: Arc<dyn ServiceLifecycle<E>>, ) -> Self
Create with a custom lifecycle and the no-op event publisher.
Sourcepub fn with_repository(repository: Arc<R>) -> Self
pub fn with_repository(repository: Arc<R>) -> Self
Create with the no-op lifecycle and no-op event publisher (generated default).
Sourcepub fn with_event_publisher(
self,
publisher: Arc<dyn CrudEventPublisher<E>>,
) -> Self
pub fn with_event_publisher( self, publisher: Arc<dyn CrudEventPublisher<E>>, ) -> Self
Replace the event publisher on an existing service (builder pattern).
Sourcepub fn repository(&self) -> &R
pub fn repository(&self) -> &R
Access the underlying repository for custom query extensions.
pub async fn list( &self, page: u32, limit: u32, filters: HashMap<String, String>, ) -> ServiceResult<(Vec<E>, u64)>
Sourcepub async fn list_with_info(
&self,
page: u32,
limit: u32,
filters: HashMap<String, String>,
) -> ServiceResult<(Vec<E>, PaginationInfo)>
pub async fn list_with_info( &self, page: u32, limit: u32, filters: HashMap<String, String>, ) -> ServiceResult<(Vec<E>, PaginationInfo)>
list, carrying the pagination info (cursor positions included) so
the HTTP layer can surface keyset paging on every generic route.
Sourcepub async fn aggregate(
&self,
spec: &AggregateSpec,
filters: HashMap<String, String>,
) -> ServiceResult<AggregateResult>
pub async fn aggregate( &self, spec: &AggregateSpec, filters: HashMap<String, String>, ) -> ServiceResult<AggregateResult>
Group and reduce the rows list would return, under the same filters.
pub async fn create(&self, dto: C) -> ServiceResult<E>
pub async fn get_by_id(&self, id: &str) -> ServiceResult<Option<E>>
pub async fn update(&self, id: &str, dto: U) -> ServiceResult<Option<E>>
pub async fn soft_delete(&self, id: &str) -> ServiceResult<bool>
pub async fn restore(&self, id: &str) -> ServiceResult<Option<E>>
pub async fn hard_delete(&self, id: &str) -> ServiceResult<bool>
pub async fn list_deleted( &self, page: u32, limit: u32, ) -> ServiceResult<(Vec<E>, u64)>
pub async fn empty_trash(&self) -> ServiceResult<u64>
pub async fn count(&self) -> ServiceResult<u64>
pub async fn count_active(&self) -> ServiceResult<u64>
Sourcepub async fn find_by_id(&self, id: &str) -> ServiceResult<Option<E>>
pub async fn find_by_id(&self, id: &str) -> ServiceResult<Option<E>>
Alias for get_by_id — used by generated handlers.
Sourcepub async fn permanent_delete(&self, id: &str) -> ServiceResult<bool>
pub async fn permanent_delete(&self, id: &str) -> ServiceResult<bool>
Alias for hard_delete — used by generated handlers.
Sourcepub async fn count_deleted(&self) -> ServiceResult<u64>
pub async fn count_deleted(&self) -> ServiceResult<u64>
Count soft-deleted entities.
Sourcepub async fn get_deleted_by_id(&self, id: &str) -> ServiceResult<Option<E>>
pub async fn get_deleted_by_id(&self, id: &str) -> ServiceResult<Option<E>>
Retrieve a soft-deleted entity by ID (includes deleted records).
Sourcepub async fn list_deleted_filtered(
&self,
page: u32,
limit: u32,
_filters: HashMap<String, String>,
) -> ServiceResult<(Vec<E>, u64)>
pub async fn list_deleted_filtered( &self, page: u32, limit: u32, _filters: HashMap<String, String>, ) -> ServiceResult<(Vec<E>, u64)>
List deleted entities with filter support (filters currently ignored, delegates to list_deleted).
Sourcepub async fn upsert(&self, dto: C) -> ServiceResult<E>
pub async fn upsert(&self, dto: C) -> ServiceResult<E>
Upsert: create the entity if it doesn’t exist (no ID-based lookup — always creates).
Sourcepub async fn partial_update(
&self,
id: &str,
fields: HashMap<String, Value>,
) -> ServiceResult<Option<E>>where
E: Serialize + DeserializeOwned,
pub async fn partial_update(
&self,
id: &str,
fields: HashMap<String, Value>,
) -> ServiceResult<Option<E>>where
E: Serialize + DeserializeOwned,
Apply a partial update from a JSON map of field values.
Fields not present in the map are left unchanged.
pub async fn bulk_create(&self, dtos: Vec<C>) -> ServiceResult<Vec<E>>where
E: FromCreateDto<C>,
Sourcepub async fn bulk_soft_delete(&self, ids: Vec<String>) -> ServiceResult<u64>
pub async fn bulk_soft_delete(&self, ids: Vec<String>) -> ServiceResult<u64>
Soft-delete many entities by id (atomic).
Sourcepub async fn bulk_restore(&self, ids: Vec<String>) -> ServiceResult<Vec<E>>
pub async fn bulk_restore(&self, ids: Vec<String>) -> ServiceResult<Vec<E>>
Restore many soft-deleted entities by id (atomic).
Sourcepub async fn restore_all(&self) -> ServiceResult<u64>
pub async fn restore_all(&self) -> ServiceResult<u64>
Restore every soft-deleted entity (atomic). Returns the number restored.
Emits a Restored event per entity, mirroring bulk_restore.
Sourcepub async fn bulk_permanent_delete(
&self,
ids: Vec<String>,
) -> ServiceResult<u64>
pub async fn bulk_permanent_delete( &self, ids: Vec<String>, ) -> ServiceResult<u64>
Permanently delete many soft-deleted entities by id (atomic).
Sourcepub async fn bulk_update(
&self,
items: Vec<(String, U)>,
) -> ServiceResult<Vec<E>>
pub async fn bulk_update( &self, items: Vec<(String, U)>, ) -> ServiceResult<Vec<E>>
Full-update many entities (atomic). Each item is (id, UpdateDto).
Sourcepub async fn bulk_partial_update(
&self,
items: Vec<(String, HashMap<String, Value>)>,
) -> ServiceResult<Vec<E>>where
E: Serialize + DeserializeOwned,
pub async fn bulk_partial_update(
&self,
items: Vec<(String, HashMap<String, Value>)>,
) -> ServiceResult<Vec<E>>where
E: Serialize + DeserializeOwned,
Partial-update many entities (atomic). Each item is (id, field_map).
Trait Implementations§
Source§impl<E, C, U, R> Clone for GenericCrudService<E, C, U, R>
impl<E, C, U, R> Clone for GenericCrudService<E, C, U, R>
Source§impl<E, C, U, R> CrudService<E, C, U> for GenericCrudService<E, C, U, R>where
E: PersistentEntity + Clone + Serialize + DeserializeOwned + FromCreateDto<C> + ApplyUpdateDto<U> + Send + Sync + 'static,
C: Send + Sync + 'static,
U: Send + Sync + 'static,
R: CrudRepository<E> + Send + Sync + 'static,
Blanket impl so that any GenericCrudService<E, C, U, R> automatically
satisfies CrudService<E, C, U> without generated adapter structs.
impl<E, C, U, R> CrudService<E, C, U> for GenericCrudService<E, C, U, R>where
E: PersistentEntity + Clone + Serialize + DeserializeOwned + FromCreateDto<C> + ApplyUpdateDto<U> + Send + Sync + 'static,
C: Send + Sync + 'static,
U: Send + Sync + 'static,
R: CrudRepository<E> + Send + Sync + 'static,
Blanket impl so that any GenericCrudService<E, C, U, R> automatically
satisfies CrudService<E, C, U> without generated adapter structs.
Generated code emits only a type alias:
pub type UserService = GenericCrudService<User, CreateUserDto, UpdateUserDto, UserRepository>;
That alias now directly implements CrudService and can be passed to
BackboneCrudHandler without any additional boilerplate.
Source§type Error = ServiceError
type Error = ServiceError
Source§fn entity_name() -> &'static str
fn entity_name() -> &'static str
?include= relations: fetch rows from table by id list, as JSON.
Default: no expansion. GenericCrudService delegates to its repository.Source§fn list<'life0, 'async_trait>(
&'life0 self,
page: u32,
limit: u32,
filters: HashMap<String, String>,
) -> Pin<Box<dyn Future<Output = Result<(Vec<E>, u64), ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn list<'life0, 'async_trait>(
&'life0 self,
page: u32,
limit: u32,
filters: HashMap<String, String>,
) -> Pin<Box<dyn Future<Output = Result<(Vec<E>, u64), ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn list_with_info<'life0, 'async_trait>(
&'life0 self,
page: u32,
limit: u32,
filters: HashMap<String, String>,
) -> Pin<Box<dyn Future<Output = Result<(Vec<E>, PaginationInfo), ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn list_with_info<'life0, 'async_trait>(
&'life0 self,
page: u32,
limit: u32,
filters: HashMap<String, String>,
) -> Pin<Box<dyn Future<Output = Result<(Vec<E>, PaginationInfo), ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
list, carrying the pagination info (cursor positions included) so
the HTTP layer can surface keyset paging. Default: the tuple form —
generated services override this with the repository’s cursors.Source§fn aggregate<'life0, 'life1, 'async_trait>(
&'life0 self,
spec: &'life1 AggregateSpec,
filters: HashMap<String, String>,
) -> Pin<Box<dyn Future<Output = Result<AggregateResult, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn aggregate<'life0, 'life1, 'async_trait>(
&'life0 self,
spec: &'life1 AggregateSpec,
filters: HashMap<String, String>,
) -> Pin<Box<dyn Future<Output = Result<AggregateResult, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
list would return, under the same filters. Read moreSource§fn table_name(&self) -> Option<&str>
fn table_name(&self) -> Option<&str>
Source§fn create<'life0, 'async_trait>(
&'life0 self,
dto: C,
) -> Pin<Box<dyn Future<Output = Result<E, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn create<'life0, 'async_trait>(
&'life0 self,
dto: C,
) -> Pin<Box<dyn Future<Output = Result<E, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn get_by_id<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Option<E>, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn get_by_id<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Option<E>, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn update<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 str,
dto: U,
) -> Pin<Box<dyn Future<Output = Result<Option<E>, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn update<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 str,
dto: U,
) -> Pin<Box<dyn Future<Output = Result<Option<E>, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn partial_update<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 str,
fields: HashMap<String, Value>,
) -> Pin<Box<dyn Future<Output = Result<Option<E>, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn partial_update<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 str,
fields: HashMap<String, Value>,
) -> Pin<Box<dyn Future<Output = Result<Option<E>, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn soft_delete<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<bool, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn soft_delete<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<bool, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn bulk_create<'life0, 'async_trait>(
&'life0 self,
items: Vec<C>,
) -> Pin<Box<dyn Future<Output = Result<Vec<E>, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn bulk_create<'life0, 'async_trait>(
&'life0 self,
items: Vec<C>,
) -> Pin<Box<dyn Future<Output = Result<Vec<E>, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn upsert<'life0, 'async_trait>(
&'life0 self,
dto: C,
) -> Pin<Box<dyn Future<Output = Result<E, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn upsert<'life0, 'async_trait>(
&'life0 self,
dto: C,
) -> Pin<Box<dyn Future<Output = Result<E, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn list_deleted<'life0, 'async_trait>(
&'life0 self,
page: u32,
limit: u32,
) -> Pin<Box<dyn Future<Output = Result<(Vec<E>, u64), ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn list_deleted<'life0, 'async_trait>(
&'life0 self,
page: u32,
limit: u32,
) -> Pin<Box<dyn Future<Output = Result<(Vec<E>, u64), ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn restore<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Option<E>, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn restore<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Option<E>, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn empty_trash<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<u64, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn empty_trash<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<u64, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn get_deleted_by_id<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Option<E>, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn get_deleted_by_id<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Option<E>, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn permanent_delete<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<bool, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn permanent_delete<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<bool, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn list_deleted_filtered<'life0, 'async_trait>(
&'life0 self,
page: u32,
limit: u32,
filters: HashMap<String, String>,
) -> Pin<Box<dyn Future<Output = Result<(Vec<E>, u64), ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn list_deleted_filtered<'life0, 'async_trait>(
&'life0 self,
page: u32,
limit: u32,
filters: HashMap<String, String>,
) -> Pin<Box<dyn Future<Output = Result<(Vec<E>, u64), ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn count_active<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<u64, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn count_active<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<u64, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn count_deleted<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<u64, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn count_deleted<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<u64, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn bulk_soft_delete<'life0, 'async_trait>(
&'life0 self,
ids: Vec<String>,
) -> Pin<Box<dyn Future<Output = Result<u64, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn bulk_soft_delete<'life0, 'async_trait>(
&'life0 self,
ids: Vec<String>,
) -> Pin<Box<dyn Future<Output = Result<u64, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn bulk_restore<'life0, 'async_trait>(
&'life0 self,
ids: Vec<String>,
) -> Pin<Box<dyn Future<Output = Result<Vec<E>, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn bulk_restore<'life0, 'async_trait>(
&'life0 self,
ids: Vec<String>,
) -> Pin<Box<dyn Future<Output = Result<Vec<E>, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn bulk_permanent_delete<'life0, 'async_trait>(
&'life0 self,
ids: Vec<String>,
) -> Pin<Box<dyn Future<Output = Result<u64, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn bulk_permanent_delete<'life0, 'async_trait>(
&'life0 self,
ids: Vec<String>,
) -> Pin<Box<dyn Future<Output = Result<u64, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn restore_all<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<u64, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn restore_all<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<u64, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn bulk_update<'life0, 'async_trait>(
&'life0 self,
items: Vec<(String, U)>,
) -> Pin<Box<dyn Future<Output = Result<Vec<E>, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn bulk_update<'life0, 'async_trait>(
&'life0 self,
items: Vec<(String, U)>,
) -> Pin<Box<dyn Future<Output = Result<Vec<E>, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
(id, UpdateDto). Read moreSource§fn bulk_partial_update<'life0, 'async_trait>(
&'life0 self,
items: Vec<(String, HashMap<String, Value>)>,
) -> Pin<Box<dyn Future<Output = Result<Vec<E>, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn bulk_partial_update<'life0, 'async_trait>(
&'life0 self,
items: Vec<(String, HashMap<String, Value>)>,
) -> Pin<Box<dyn Future<Output = Result<Vec<E>, ServiceError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
(id, field_map). Read moreAuto Trait Implementations§
impl<E, C, U, R> !RefUnwindSafe for GenericCrudService<E, C, U, R>
impl<E, C, U, R> !UnwindSafe for GenericCrudService<E, C, U, R>
impl<E, C, U, R> Freeze for GenericCrudService<E, C, U, R>where
Arc<R>: Freeze,
Arc<dyn ServiceLifecycle<E>>: Freeze,
Arc<dyn CrudEventPublisher<E>>: Freeze,
PhantomData<(C, U)>: Freeze,
impl<E, C, U, R> Send for GenericCrudService<E, C, U, R>where
Arc<R>: Send,
Arc<dyn ServiceLifecycle<E>>: Send,
Arc<dyn CrudEventPublisher<E>>: Send,
PhantomData<(C, U)>: Send,
impl<E, C, U, R> Sync for GenericCrudService<E, C, U, R>where
Arc<R>: Sync,
Arc<dyn ServiceLifecycle<E>>: Sync,
Arc<dyn CrudEventPublisher<E>>: Sync,
PhantomData<(C, U)>: Sync,
impl<E, C, U, R> Unpin for GenericCrudService<E, C, U, R>where
Arc<R>: Unpin,
Arc<dyn ServiceLifecycle<E>>: Unpin,
Arc<dyn CrudEventPublisher<E>>: Unpin,
PhantomData<(C, U)>: Unpin,
impl<E, C, U, R> UnsafeUnpin for GenericCrudService<E, C, U, R>where
Arc<R>: UnsafeUnpin,
Arc<dyn ServiceLifecycle<E>>: UnsafeUnpin,
Arc<dyn CrudEventPublisher<E>>: UnsafeUnpin,
PhantomData<(C, U)>: UnsafeUnpin,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more