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
use std::fmt;
use crate::commons::api::{
PublishDelta, PublisherHandle, RepositoryHandle, StorableRepositoryCommand,
};
use crate::commons::eventsourcing::CommandDetails;
use crate::commons::eventsourcing::SentCommand;
use crate::commons::remote::rfc8183;
use crate::pubd::Evt;
pub type Cmd = SentCommand<CmdDet>;
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[allow(clippy::large_enum_variant)]
#[serde(rename_all = "snake_case")]
pub enum CmdDet {
AddPublisher(rfc8183::PublisherRequest),
RemovePublisher(PublisherHandle),
Publish(PublisherHandle, PublishDelta),
}
impl CommandDetails for CmdDet {
type Event = Evt;
type StorableDetails = StorableRepositoryCommand;
fn store(&self) -> Self::StorableDetails {
self.clone().into()
}
}
impl CmdDet {
pub fn add_publisher(handle: &RepositoryHandle, request: rfc8183::PublisherRequest) -> Cmd {
SentCommand::new(handle, None, CmdDet::AddPublisher(request))
}
pub fn remove_publisher(handle: &RepositoryHandle, publisher: PublisherHandle) -> Cmd {
SentCommand::new(handle, None, CmdDet::RemovePublisher(publisher))
}
pub fn publish(
handle: &RepositoryHandle,
publisher: PublisherHandle,
delta: PublishDelta,
) -> Cmd {
SentCommand::new(handle, None, CmdDet::Publish(publisher, delta))
}
}
impl fmt::Display for CmdDet {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
StorableRepositoryCommand::from(self.clone()).fmt(f)
}
}
impl From<CmdDet> for StorableRepositoryCommand {
fn from(d: CmdDet) -> Self {
match d {
CmdDet::AddPublisher(req) => {
let (_, pbl, id) = req.unpack();
StorableRepositoryCommand::AddPublisher(pbl, id.ski_hex())
}
CmdDet::RemovePublisher(pbl) => StorableRepositoryCommand::RemovePublisher(pbl),
CmdDet::Publish(pbl, delta) => StorableRepositoryCommand::Publish(
pbl,
delta.publishes().len(),
delta.updates().len(),
delta.withdraws().len(),
),
}
}
}