bitwarden_vault/cipher/
linked_id.rs

1use 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}