bitwarden_importers/importers/onepassword/convert/
claimed.rs1use super::value::{non_blank, render_value};
5use crate::importers::onepassword::access::wire::{VaultItemDetails, VaultItemSectionField};
6
7#[derive(Default)]
9pub(super) struct Claimed {
10 pub(super) designations: &'static [&'static str],
12 pub(super) fields: Vec<usize>,
15}
16
17impl Claimed {
18 pub(super) fn take<'a, T>(
21 &mut self,
22 details: &'a VaultItemDetails,
23 id: &str,
24 read: impl FnOnce(&'a VaultItemSectionField) -> Option<T>,
25 ) -> Option<T> {
26 let (position, field) = section_fields(details)
27 .enumerate()
28 .find(|(_, field)| field.id.as_deref() == Some(id))?;
29 let value = read(field)?;
30 self.fields.push(position);
31 Some(value)
32 }
33
34 pub(super) fn take_text(&mut self, details: &VaultItemDetails, id: &str) -> Option<String> {
37 self.take(details, id, |field| {
38 render_value(field.kind.as_deref(), field.value.as_ref()?)
39 })
40 }
41}
42
43pub(super) fn section_fields(
46 details: &VaultItemDetails,
47) -> impl Iterator<Item = &VaultItemSectionField> {
48 details
49 .sections
50 .iter()
51 .flatten()
52 .flat_map(|section| section.fields.iter().flatten())
53}
54
55pub(super) fn designation(details: &VaultItemDetails, designation: &str) -> Option<String> {
58 details
59 .fields
60 .iter()
61 .flatten()
62 .find(|field| field.designation.as_deref() == Some(designation))
63 .and_then(|field| field.value.as_deref())
64 .and_then(non_blank)
65 .map(str::to_string)
66}