Skip to main content

doublets/decorators/
deletion.rs

1//! Deletion decorator that resets a link's contents before deleting it.
2//!
3//! Port of C# `NonNullContentsLinkDeletionResolver`.
4
5use std::{
6    fmt::{self, Debug, Formatter},
7    marker::PhantomData,
8};
9
10use data::{Flow, LinkReference, LinksConstants};
11
12use super::{
13    helpers,
14    macros::{decorator_struct, forward},
15};
16use crate::{
17    data::{ReadHandler, WriteHandler},
18    Doublets, Error, Fuse, Link, Links,
19};
20
21decorator_struct! {
22    /// Resets a link to `(null, null)` before deleting it, so the store's indexes are
23    /// updated before the link disappears.
24    ///
25    /// Port of C# `NonNullContentsLinkDeletionResolver`.
26    NonNullContentsLinkDeletionResolver
27}
28
29impl<T: LinkReference, L: Doublets<T>> Links<T> for NonNullContentsLinkDeletionResolver<T, L> {
30    forward!(count_links, each_links, create_links, update_links);
31
32    #[inline]
33    fn delete_links(
34        &mut self,
35        query: &[T],
36        handler: WriteHandler<'_, T>,
37    ) -> Result<Flow, Error<T>> {
38        let index = helpers::part(query, self.links.constants().index_part);
39        let mut fuse = Fuse::new(&mut *handler);
40        helpers::enforce_reset_values(&mut self.links, index, &mut |before, after| {
41            fuse.call(before, after)
42        })?;
43        self.links
44            .delete_links(query, &mut |before, after| fuse.call(before, after))
45    }
46}