1use serde::{Deserialize, Serialize};
2
3use super::common::{ApiErrorCode, Country};
4use super::org_number::OrgNumber;
5use super::url::Url;
6
7#[non_exhaustive]
9#[derive(Debug, Clone, Serialize, Deserialize)]
10pub enum FrejaRegistrationLevel {
11 #[serde(rename = "EXTENDED")]
13 Extended,
14 #[serde(rename = "PLUS")]
16 Plus,
17}
18
19impl Default for FrejaRegistrationLevel {
20 #[inline]
21 fn default() -> Self {
22 Self::Extended
23 }
24}
25
26#[must_use]
28#[derive(Debug, Clone, Default, Serialize)]
29#[serde(rename_all = "camelCase")]
30pub struct FrejaAuthRequest {
31 #[serde(skip_serializing_if = "Option::is_none")]
33 pub ssn: Option<String>,
34 #[serde(skip_serializing_if = "Option::is_none")]
36 pub callback_url: Option<Url>,
37 #[serde(skip_serializing_if = "Option::is_none")]
39 pub min_registration_level: Option<FrejaRegistrationLevel>,
40 #[serde(skip_serializing_if = "Option::is_none")]
42 pub org_number: Option<OrgNumber>,
43 #[serde(skip_serializing_if = "Option::is_none")]
45 pub request_address: Option<bool>,
46 #[serde(skip_serializing_if = "Option::is_none")]
48 pub ref_id: Option<String>,
49}
50
51impl FrejaAuthRequest {
52 #[inline]
53 pub fn new() -> Self {
54 Self::default()
55 }
56
57 #[inline]
58 pub fn ssn(mut self, v: impl Into<String>) -> Self {
59 self.ssn = Some(v.into());
60 self
61 }
62
63 #[inline]
64 pub fn callback_url(mut self, url: Url) -> Self {
65 self.callback_url = Some(url);
66 self
67 }
68
69 #[inline]
70 pub fn min_registration_level(mut self, v: FrejaRegistrationLevel) -> Self {
71 self.min_registration_level = Some(v);
72 self
73 }
74
75 #[inline]
76 pub fn org_number(mut self, org_number: OrgNumber) -> Self {
77 self.org_number = Some(org_number);
78 self
79 }
80
81 #[inline]
82 pub fn request_address(mut self, v: bool) -> Self {
83 self.request_address = Some(v);
84 self
85 }
86
87 #[inline]
88 pub fn ref_id(mut self, ref_id: impl Into<String>) -> Self {
89 self.ref_id = Some(ref_id.into());
90 self
91 }
92}
93
94#[must_use]
96#[derive(Debug, Clone, Serialize)]
97#[serde(rename_all = "camelCase")]
98pub struct FrejaBackchannelAuthRequest {
99 pub ssn: String,
101 pub country: Country,
103 #[serde(skip_serializing_if = "Option::is_none")]
105 pub callback_url: Option<Url>,
106 pub min_registration_level: FrejaRegistrationLevel,
108 #[serde(skip_serializing_if = "Option::is_none")]
110 pub org_number: Option<OrgNumber>,
111 #[serde(skip_serializing_if = "Option::is_none")]
113 pub request_address: Option<bool>,
114 #[serde(skip_serializing_if = "Option::is_none")]
116 pub ref_id: Option<String>,
117}
118
119impl FrejaBackchannelAuthRequest {
120 #[inline]
121 pub fn new(
122 ssn: impl Into<String>,
123 country: Country,
124 min_registration_level: FrejaRegistrationLevel,
125 ) -> Self {
126 Self {
127 ssn: ssn.into(),
128 country,
129 min_registration_level,
130 callback_url: None,
131 org_number: None,
132 request_address: None,
133 ref_id: None,
134 }
135 }
136
137 #[inline]
138 pub fn callback_url(mut self, url: Url) -> Self {
139 self.callback_url = Some(url);
140 self
141 }
142
143 #[inline]
144 pub fn org_number(mut self, org_number: OrgNumber) -> Self {
145 self.org_number = Some(org_number);
146 self
147 }
148
149 #[inline]
150 pub fn request_address(mut self, v: bool) -> Self {
151 self.request_address = Some(v);
152 self
153 }
154
155 #[inline]
156 pub fn ref_id(mut self, ref_id: impl Into<String>) -> Self {
157 self.ref_id = Some(ref_id.into());
158 self
159 }
160}
161
162#[must_use]
164#[derive(Debug, Clone, Serialize)]
165#[serde(rename_all = "camelCase")]
166pub struct FrejaSignRequest {
167 pub text: String,
169 #[serde(skip_serializing_if = "Option::is_none")]
171 pub ssn: Option<String>,
172 #[serde(skip_serializing_if = "Option::is_none")]
174 pub callback_url: Option<Url>,
175 #[serde(skip_serializing_if = "Option::is_none")]
177 pub min_registration_level: Option<FrejaRegistrationLevel>,
178 #[serde(skip_serializing_if = "Option::is_none")]
180 pub org_number: Option<OrgNumber>,
181 #[serde(skip_serializing_if = "Option::is_none")]
183 pub request_address: Option<bool>,
184 #[serde(skip_serializing_if = "Option::is_none")]
186 pub ref_id: Option<String>,
187}
188
189impl FrejaSignRequest {
190 #[inline]
191 pub fn new(text: impl Into<String>) -> Self {
192 Self {
193 text: text.into(),
194 ssn: None,
195 callback_url: None,
196 min_registration_level: None,
197 org_number: None,
198 request_address: None,
199 ref_id: None,
200 }
201 }
202
203 #[inline]
204 pub fn ssn(mut self, v: impl Into<String>) -> Self {
205 self.ssn = Some(v.into());
206 self
207 }
208
209 #[inline]
210 pub fn callback_url(mut self, url: Url) -> Self {
211 self.callback_url = Some(url);
212 self
213 }
214
215 #[inline]
216 pub fn min_registration_level(mut self, v: FrejaRegistrationLevel) -> Self {
217 self.min_registration_level = Some(v);
218 self
219 }
220
221 #[inline]
222 pub fn org_number(mut self, org_number: OrgNumber) -> Self {
223 self.org_number = Some(org_number);
224 self
225 }
226
227 #[inline]
228 pub fn request_address(mut self, v: bool) -> Self {
229 self.request_address = Some(v);
230 self
231 }
232
233 #[inline]
234 pub fn ref_id(mut self, ref_id: impl Into<String>) -> Self {
235 self.ref_id = Some(ref_id.into());
236 self
237 }
238}
239
240#[must_use]
242#[derive(Debug, Clone, Serialize)]
243#[serde(rename_all = "camelCase")]
244pub struct FrejaBackchannelSignRequest {
245 pub ssn: String,
247 pub country: Country,
249 pub text: String,
251 #[serde(skip_serializing_if = "Option::is_none")]
253 pub callback_url: Option<Url>,
254 #[serde(skip_serializing_if = "Option::is_none")]
256 pub min_registration_level: Option<FrejaRegistrationLevel>,
257 #[serde(skip_serializing_if = "Option::is_none")]
259 pub org_number: Option<OrgNumber>,
260 #[serde(skip_serializing_if = "Option::is_none")]
262 pub request_address: Option<bool>,
263 #[serde(skip_serializing_if = "Option::is_none")]
265 pub ref_id: Option<String>,
266}
267
268impl FrejaBackchannelSignRequest {
269 #[inline]
270 pub fn new(ssn: impl Into<String>, country: Country, text: impl Into<String>) -> Self {
271 Self {
272 ssn: ssn.into(),
273 country,
274 text: text.into(),
275 callback_url: None,
276 min_registration_level: None,
277 org_number: None,
278 request_address: None,
279 ref_id: None,
280 }
281 }
282
283 #[inline]
284 pub fn callback_url(mut self, url: Url) -> Self {
285 self.callback_url = Some(url);
286 self
287 }
288
289 #[inline]
290 pub fn min_registration_level(mut self, v: FrejaRegistrationLevel) -> Self {
291 self.min_registration_level = Some(v);
292 self
293 }
294
295 #[inline]
296 pub fn org_number(mut self, org_number: OrgNumber) -> Self {
297 self.org_number = Some(org_number);
298 self
299 }
300
301 #[inline]
302 pub fn request_address(mut self, v: bool) -> Self {
303 self.request_address = Some(v);
304 self
305 }
306
307 #[inline]
308 pub fn ref_id(mut self, ref_id: impl Into<String>) -> Self {
309 self.ref_id = Some(ref_id.into());
310 self
311 }
312}
313
314#[non_exhaustive]
316#[derive(Debug, Clone, Deserialize)]
317#[serde(tag = "status")]
318pub enum FrejaStatus {
319 #[serde(rename = "PENDING")]
320 Pending(FrejaPending),
321 #[serde(rename = "COMPLETED")]
322 Completed(FrejaCompleted),
323 #[serde(rename = "FAILED")]
324 Failed(FrejaFailed),
325}
326
327#[derive(Debug, Clone, Deserialize)]
329#[serde(rename_all = "camelCase")]
330pub struct FrejaPending {
331 pub id: String,
332 pub ref_id: Option<String>,
333 pub auto_start_token: Option<String>,
335 pub qr_data: Option<String>,
337}
338
339#[derive(Debug, Clone, Deserialize)]
341#[serde(rename_all = "camelCase")]
342pub struct FrejaCompleted {
343 pub id: String,
344 pub ref_id: Option<String>,
345 pub ssn: String,
346 pub country: Country,
348 pub name: String,
349 pub given_name: String,
350 pub surname: String,
351 pub address: Option<String>,
353 pub company_signatory_text: Option<String>,
355}
356
357#[derive(Debug, Clone, Deserialize)]
359#[serde(rename_all = "camelCase")]
360pub struct FrejaFailed {
361 pub id: String,
362 pub ref_id: Option<String>,
363 pub error: ApiErrorCode,
364}