1use std::fmt::{self, Debug};
2
3use bytes::Bytes;
4use cid::Cid;
5use derive_more::{From, TryInto};
6use quic_rpc::{
7 message::{Msg, RpcMsg, ServerStreaming},
8 Service,
9};
10use serde::{Deserialize, Serialize};
11
12use crate::{RpcResult, VersionRequest, VersionResponse, WatchRequest, WatchResponse};
13
14pub type StoreAddr = super::addr::Addr<StoreService>;
15
16#[derive(Serialize, Deserialize)]
17pub struct PutRequest {
18 pub cid: Cid,
19 pub blob: Bytes,
20 pub links: Vec<Cid>,
21}
22
23impl fmt::Debug for PutRequest {
24 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
25 f.debug_struct("PutRequest")
26 .field("cid", &self.cid)
27 .field("blob", &self.blob.len())
28 .field("links", &self.links)
29 .finish()
30 }
31}
32
33#[derive(Serialize, Deserialize, Debug)]
34pub struct PutManyRequest {
35 pub blocks: Vec<PutRequest>,
36}
37
38#[derive(Serialize, Deserialize, Debug)]
39pub struct GetRequest {
40 pub cid: Cid,
41}
42
43#[derive(Serialize, Deserialize, Debug)]
44pub struct GetResponse {
45 pub data: Option<Bytes>,
46}
47
48#[derive(Serialize, Deserialize, Debug)]
49pub struct HasRequest {
50 pub cid: Cid,
51}
52
53#[derive(Serialize, Deserialize, Debug)]
54pub struct HasResponse {
55 pub has: bool,
56}
57
58#[derive(Serialize, Deserialize, Debug)]
59pub struct GetLinksRequest {
60 pub cid: Cid,
61}
62
63#[derive(Serialize, Deserialize, Debug)]
64pub struct GetLinksResponse {
65 pub links: Option<Vec<Cid>>,
66}
67
68#[derive(Serialize, Deserialize, Debug)]
69pub struct GetSizeRequest {
70 pub cid: Cid,
71}
72
73#[derive(Serialize, Deserialize, Debug)]
74pub struct GetSizeResponse {
75 pub size: Option<u64>,
76}
77
78#[derive(Serialize, Deserialize, Debug, From, TryInto)]
79pub enum StoreRequest {
80 Watch(WatchRequest),
81 Version(VersionRequest),
82 Put(PutRequest),
83 PutMany(PutManyRequest),
84 Get(GetRequest),
85 Has(HasRequest),
86 GetLinks(GetLinksRequest),
87 GetSize(GetSizeRequest),
88}
89
90#[derive(Serialize, Deserialize, Debug, From, TryInto)]
91pub enum StoreResponse {
92 Watch(WatchResponse),
93 Version(VersionResponse),
94 Get(RpcResult<GetResponse>),
95 Has(RpcResult<HasResponse>),
96 GetLinks(RpcResult<GetLinksResponse>),
97 GetSize(RpcResult<GetSizeResponse>),
98 Unit(()),
99 UnitResult(RpcResult<()>),
100}
101
102#[derive(Debug, Clone, Copy)]
103pub struct StoreService;
104
105impl Service for StoreService {
106 type Req = StoreRequest;
107
108 type Res = StoreResponse;
109}
110
111impl Msg<StoreService> for WatchRequest {
112 type Response = WatchResponse;
113
114 type Update = Self;
115
116 type Pattern = ServerStreaming;
117}
118
119impl RpcMsg<StoreService> for VersionRequest {
120 type Response = VersionResponse;
121}
122
123impl RpcMsg<StoreService> for GetRequest {
124 type Response = RpcResult<GetResponse>;
125}
126
127impl RpcMsg<StoreService> for PutRequest {
128 type Response = RpcResult<()>;
129}
130
131impl RpcMsg<StoreService> for HasRequest {
132 type Response = RpcResult<HasResponse>;
133}
134
135impl RpcMsg<StoreService> for PutManyRequest {
136 type Response = RpcResult<()>;
137}
138
139impl RpcMsg<StoreService> for GetLinksRequest {
140 type Response = RpcResult<GetLinksResponse>;
141}
142
143impl RpcMsg<StoreService> for GetSizeRequest {
144 type Response = RpcResult<GetSizeResponse>;
145}