bitwarden_vault/cipher/
linked_id.rs1use bitwarden_core::MissingFieldError;
2use serde::{Deserialize, Serialize};
3use serde_repr::{Deserialize_repr, Serialize_repr};
4#[cfg(feature = "wasm")]
5use tsify_next::Tsify;
6#[cfg(feature = "wasm")]
7use wasm_bindgen::prelude::wasm_bindgen;
8
9#[derive(Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Debug)]
10#[serde(untagged)]
11#[cfg_attr(feature = "wasm", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))]
12pub enum LinkedIdType {
13 Login(LoginLinkedIdType),
14 Card(CardLinkedIdType),
15 Identity(IdentityLinkedIdType),
16}
17
18#[cfg(feature = "uniffi")]
19uniffi::custom_type!(LinkedIdType, u32);
20
21impl From<LinkedIdType> for u32 {
22 fn from(v: LinkedIdType) -> Self {
23 serde_json::to_value(v)
24 .expect("LinkedIdType should be serializable")
25 .as_u64()
26 .expect("Not a numeric enum value") as u32
27 }
28}
29
30#[derive(Clone, Copy, PartialEq, Eq, Serialize_repr, Deserialize_repr, Debug)]
31#[repr(u16)]
32#[cfg_attr(feature = "wasm", wasm_bindgen)]
33pub enum LoginLinkedIdType {
34 Username = 100,
35 Password = 101,
36}
37
38#[derive(Clone, Copy, PartialEq, Eq, Serialize_repr, Deserialize_repr, Debug)]
39#[repr(u16)]
40#[cfg_attr(feature = "wasm", wasm_bindgen)]
41pub enum CardLinkedIdType {
42 CardholderName = 300,
43 ExpMonth = 301,
44 ExpYear = 302,
45 Code = 303,
46 Brand = 304,
47 Number = 305,
48}
49
50#[derive(Clone, Copy, PartialEq, Eq, Serialize_repr, Deserialize_repr, Debug)]
51#[repr(u16)]
52#[cfg_attr(feature = "wasm", wasm_bindgen)]
53pub enum IdentityLinkedIdType {
54 Title = 400,
55 MiddleName = 401,
56 Address1 = 402,
57 Address2 = 403,
58 Address3 = 404,
59 City = 405,
60 State = 406,
61 PostalCode = 407,
62 Country = 408,
63 Company = 409,
64 Email = 410,
65 Phone = 411,
66 Ssn = 412,
67 Username = 413,
68 PassportNumber = 414,
69 LicenseNumber = 415,
70 FirstName = 416,
71 LastName = 417,
72 FullName = 418,
73}
74
75impl TryFrom<u32> for LinkedIdType {
76 type Error = MissingFieldError;
77
78 fn try_from(val: u32) -> Result<Self, Self::Error> {
79 let val = serde_json::Value::Number(val.into());
80 serde_json::from_value(val).map_err(|_| MissingFieldError("LinkedIdType"))
81 }
82}
83
84#[cfg(test)]
85mod tests {
86
87 #[test]
88 fn test_linked_id_serialization() {
89 use super::{LinkedIdType, LoginLinkedIdType};
90
91 #[derive(serde::Serialize, serde::Deserialize)]
92 struct Test {
93 id: LinkedIdType,
94 }
95
96 let json = "{\"id\":100}";
97 let val = serde_json::from_str::<Test>(json).unwrap();
98
99 assert_eq!(val.id, LinkedIdType::Login(LoginLinkedIdType::Username));
100
101 let serialized = serde_json::to_string(&val).unwrap();
102 assert_eq!(serialized, json);
103 }
104
105 #[cfg(feature = "uniffi")]
106 #[test]
107 fn test_linked_id_serialization_uniffi() {
108 use super::{CardLinkedIdType, LinkedIdType, LoginLinkedIdType};
109
110 assert_eq!(
111 100,
112 u32::from(LinkedIdType::Login(LoginLinkedIdType::Username))
113 );
114 assert_eq!(303, u32::from(LinkedIdType::Card(CardLinkedIdType::Code)));
115
116 assert_eq!(
117 LinkedIdType::Login(LoginLinkedIdType::Username),
118 100.try_into().unwrap()
119 );
120 assert_eq!(
121 LinkedIdType::Card(CardLinkedIdType::Code),
122 303.try_into().unwrap()
123 );
124 }
125}