diff options
author | Jesse Luehrs <doy@tozt.net> | 2020-04-20 00:05:01 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2020-04-20 00:05:01 -0400 |
commit | 9db9908cd3aa97933a543800d69945484a81e62a (patch) | |
tree | bea0d991a4ae2fafda577aafc63b3f5e8bfdc875 /src/api.rs | |
parent | 19f9dc4877039c87de94080ac554cfa169e9cd71 (diff) | |
download | rbw-9db9908cd3aa97933a543800d69945484a81e62a.tar.gz rbw-9db9908cd3aa97933a543800d69945484a81e62a.zip |
add folder as an option for list fields
Diffstat (limited to 'src/api.rs')
-rw-r--r-- | src/api.rs | 32 |
1 files changed, 30 insertions, 2 deletions
@@ -75,12 +75,16 @@ struct SyncRes { ciphers: Vec<SyncResCipher>, #[serde(rename = "Profile")] profile: SyncResProfile, + #[serde(rename = "Folders")] + folders: Vec<SyncResFolder>, } #[derive(serde::Serialize, serde::Deserialize, Debug, Clone)] struct SyncResCipher { #[serde(rename = "Id")] id: String, + #[serde(rename = "FolderId")] + folder_id: Option<String>, #[serde(rename = "Name")] name: String, #[serde(rename = "Login")] @@ -93,7 +97,10 @@ struct SyncResCipher { impl SyncResCipher { // TODO: handle other kinds of entries other than login - fn to_entry(&self) -> Option<crate::db::Entry> { + fn to_entry( + &self, + folders: &[SyncResFolder], + ) -> Option<crate::db::Entry> { if let Some(login) = &self.login { let history = if let Some(history) = &self.password_history { history @@ -106,8 +113,20 @@ impl SyncResCipher { } else { vec![] }; + let folder = if let Some(folder_id) = &self.folder_id { + let mut folder_name = None; + for folder in folders { + if &folder.id == folder_id { + folder_name = Some(folder.name.clone()); + } + } + folder_name + } else { + None + }; Some(crate::db::Entry { id: self.id.clone(), + folder, name: self.name.clone(), username: login.username.clone(), password: login.password.clone(), @@ -126,6 +145,14 @@ struct SyncResProfile { key: String, } +#[derive(serde::Deserialize, Debug, Clone)] +struct SyncResFolder { + #[serde(rename = "Id")] + id: String, + #[serde(rename = "Name")] + name: String, +} + #[derive(serde::Serialize, serde::Deserialize, Debug, Clone)] struct SyncResLogin { #[serde(rename = "Username")] @@ -301,10 +328,11 @@ impl Client { reqwest::StatusCode::OK => { let sync_res: SyncRes = res.json().await.context(crate::error::Reqwest)?; + let folders = sync_res.folders.clone(); let ciphers = sync_res .ciphers .iter() - .filter_map(SyncResCipher::to_entry) + .filter_map(|cipher| cipher.to_entry(&folders)) .collect(); Ok((sync_res.profile.key, ciphers)) } |