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