1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
use std::borrow::BorrowMut;
use std::default::default;
use std::marker::PhantomData;
use std::ops::Try;
use doublets::data::LinksConstants;
use doublets::data::ToQuery;
use doublets::num::LinkType;
use doublets::{Doublet, Doublets, Error, Link};
pub struct UniqueValidator<T: LinkType, L: Doublets<T>> {
links: L,
_phantom: PhantomData<T>,
}
impl<T: LinkType, L: Doublets<T>> UniqueValidator<T, L> {
pub fn new(links: L) -> Self {
Self {
links,
_phantom: default(),
}
}
}
impl<T: LinkType, L: Doublets<T>> Doublets<T> for UniqueValidator<T, L> {
fn constants(&self) -> LinksConstants<T> {
self.links.constants()
}
fn count_by(&self, query: impl ToQuery<T>) -> T {
self.links.count_by(query)
}
fn create_by_with<F, R>(&mut self, query: impl ToQuery<T>, handler: F) -> Result<R, Error<T>>
where
F: FnMut(Link<T>, Link<T>) -> R,
R: Try<Output = ()>,
{
self.links.create_by_with(query, handler)
}
fn try_each_by<F, R>(&self, restrictions: impl ToQuery<T>, handler: F) -> R
where
F: FnMut(Link<T>) -> R,
R: Try<Output = ()>,
{
self.links.try_each_by(restrictions, handler)
}
fn update_by_with<F, R>(
&mut self,
query: impl ToQuery<T>,
replacement: impl ToQuery<T>,
handler: F,
) -> Result<R, Error<T>>
where
F: FnMut(Link<T>, Link<T>) -> R,
R: Try<Output = ()>,
{
let links = self.links.borrow_mut();
let any = links.constants().any;
let replacement = replacement.to_query();
if links.found([any, replacement[1], replacement[2]]) {
Err(Error::AlreadyExists(Doublet::new(
replacement[1],
replacement[2],
)))
} else {
links.update_by_with(query, replacement, handler)
}
}
fn delete_by_with<F, R>(&mut self, query: impl ToQuery<T>, handler: F) -> Result<R, Error<T>>
where
F: FnMut(Link<T>, Link<T>) -> R,
R: Try<Output = ()>,
{
self.links.delete_by_with(query, handler)
}
}