1use crate::types::PublicKey;
2use crate::{DocumentId, OwnerFilter};
3use m10_protos::sdk;
4
5pub struct PageBuilder<ID: DocumentId, T = ()> {
6 filter: T,
7 limit: Option<u32>,
8 last_id: Option<ID>,
9}
10
11impl<ID: DocumentId, T: Default> Default for PageBuilder<ID, T> {
12 fn default() -> Self {
13 Self {
14 filter: T::default(),
15 limit: None,
16 last_id: None,
17 }
18 }
19}
20
21impl<ID: DocumentId, T> PageBuilder<ID, T> {
22 pub fn filter(filter: T) -> Self {
23 Self {
24 filter,
25 limit: None,
26 last_id: None,
27 }
28 }
29
30 pub fn limit(mut self, limit: u32) -> Self {
31 self.limit = Some(limit);
32 self
33 }
34
35 pub fn last_id(mut self, id: ID) -> Self {
36 self.last_id = Some(id);
37 self
38 }
39}
40
41impl<ID: DocumentId> From<PageBuilder<ID, ()>> for Option<sdk::Page> {
42 fn from(builder: PageBuilder<ID, ()>) -> Self {
43 if builder.limit.is_none() && builder.last_id.is_none() {
44 None
45 } else {
46 Some(sdk::Page {
47 limit: builder.limit.unwrap_or(20),
48 last_id: builder
49 .last_id
50 .map(DocumentId::into_vec)
51 .unwrap_or_default(),
52 })
53 }
54 }
55}
56
57#[derive(Clone, Debug)]
58pub struct NameFilter {
59 name: String,
60}
61
62impl<ID: DocumentId> PageBuilder<ID, NameFilter> {
63 pub fn name(name: impl Into<String>) -> Self {
64 PageBuilder {
65 filter: NameFilter { name: name.into() },
66 limit: None,
67 last_id: None,
68 }
69 }
70}
71
72#[derive(Clone, Debug)]
73pub enum NameOrOwnerFilter {
74 Name(String),
75 Owner(PublicKey),
76}
77
78impl<ID: DocumentId> PageBuilder<ID, NameOrOwnerFilter> {
79 pub fn name(name: impl Into<String>) -> Self {
80 PageBuilder::filter(NameOrOwnerFilter::Name(name.into()))
81 }
82
83 pub fn owner(owner: PublicKey) -> Self {
84 PageBuilder::filter(NameOrOwnerFilter::Owner(owner))
85 }
86}
87
88impl From<NameOrOwnerFilter> for sdk::list_account_sets_request::Filter {
89 fn from(filter: NameOrOwnerFilter) -> Self {
90 match filter {
91 NameOrOwnerFilter::Name(name) => sdk::list_account_sets_request::Filter::Name(name),
92 NameOrOwnerFilter::Owner(owner) => {
93 sdk::list_account_sets_request::Filter::Owner(owner.0)
94 }
95 }
96 }
97}
98
99impl From<NameOrOwnerFilter> for sdk::list_account_metadata_request::Filter {
100 fn from(filter: NameOrOwnerFilter) -> Self {
101 match filter {
102 NameOrOwnerFilter::Name(name) => sdk::list_account_metadata_request::Filter::Name(name),
103 NameOrOwnerFilter::Owner(owner) => {
104 sdk::list_account_metadata_request::Filter::Owner(owner.0)
105 }
106 }
107 }
108}
109
110impl<ID: DocumentId> From<PageBuilder<ID, NameFilter>> for sdk::ListRolesRequest {
111 fn from(builder: PageBuilder<ID, NameFilter>) -> Self {
112 let page = PageBuilder::<ID, ()> {
113 filter: (),
114 limit: builder.limit,
115 last_id: builder.last_id,
116 }
117 .into();
118 Self {
119 page,
120 filter: Some(sdk::list_roles_request::Filter::Name(builder.filter.name)),
121 }
122 }
123}
124
125impl<ID: DocumentId> From<PageBuilder<ID, NameFilter>> for sdk::ListRoleBindingsRequest {
126 fn from(builder: PageBuilder<ID, NameFilter>) -> Self {
127 let page = PageBuilder::<ID, ()> {
128 filter: (),
129 limit: builder.limit,
130 last_id: builder.last_id,
131 }
132 .into();
133 Self {
134 page,
135 filter: Some(sdk::list_role_bindings_request::Filter::Name(
136 builder.filter.name,
137 )),
138 }
139 }
140}
141
142impl<ID: DocumentId> From<PageBuilder<ID, NameOrOwnerFilter>> for sdk::ListAccountSetsRequest {
143 fn from(builder: PageBuilder<ID, NameOrOwnerFilter>) -> Self {
144 let page = PageBuilder::<ID, ()> {
145 filter: (),
146 limit: builder.limit,
147 last_id: builder.last_id,
148 }
149 .into();
150 Self {
151 page,
152 filter: Some(builder.filter.into()),
153 }
154 }
155}
156
157impl<ID: DocumentId> From<PageBuilder<ID, NameOrOwnerFilter>> for sdk::ListAccountMetadataRequest {
158 fn from(builder: PageBuilder<ID, NameOrOwnerFilter>) -> Self {
159 let page = PageBuilder::<ID, ()> {
160 filter: (),
161 limit: builder.limit,
162 last_id: builder.last_id,
163 }
164 .into();
165 Self {
166 page,
167 filter: Some(builder.filter.into()),
168 }
169 }
170}
171
172impl<ID: DocumentId> PageBuilder<ID, OwnerFilter> {
173 pub fn owner(owner: Vec<u8>) -> Self {
174 Self {
175 filter: OwnerFilter::new(owner),
176 limit: None,
177 last_id: None,
178 }
179 }
180}
181
182impl<ID: DocumentId> From<PageBuilder<ID, OwnerFilter>> for sdk::ListAccountMetadataRequest {
183 fn from(builder: PageBuilder<ID, OwnerFilter>) -> Self {
184 let page = PageBuilder::<ID, ()> {
185 filter: (),
186 limit: builder.limit,
187 last_id: builder.last_id,
188 }
189 .into();
190 Self {
191 page,
192 filter: Some(builder.filter.into()),
193 }
194 }
195}