m10_sdk/builders/
page.rs

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}