use crate::bin_error;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub(super) enum Field {
Notes,
Username,
Password,
Totp,
Uris,
IdentityName,
City,
State,
PostalCode,
Country,
Phone,
Ssn,
License,
Passport,
CardNumber,
Expiration,
ExpMonth,
ExpYear,
Cvv,
Cardholder,
Brand,
Name,
Email,
Address,
Address1,
Address2,
Address3,
Fingerprint,
PublicKey,
PrivateKey,
Title,
FirstName,
MiddleName,
LastName,
}
impl std::str::FromStr for Field {
type Err = crate::bin_error::Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s.to_lowercase().as_str() {
"notes" | "note" => Self::Notes,
"username" | "user" => Self::Username,
"password" => Self::Password,
"totp" | "code" => Self::Totp,
"uris" | "urls" | "sites" => Self::Uris,
"identityname" => Self::IdentityName,
"city" => Self::City,
"state" => Self::State,
"postcode" | "zipcode" | "zip" => Self::PostalCode,
"country" => Self::Country,
"phone" => Self::Phone,
"ssn" => Self::Ssn,
"license" => Self::License,
"passport" => Self::Passport,
"number" | "card" => Self::CardNumber,
"exp" => Self::Expiration,
"exp_month" | "month" => Self::ExpMonth,
"exp_year" | "year" => Self::ExpYear,
"cvv" => Self::Cvv,
"cardholder" | "cardholder_name" => Self::Cardholder,
"brand" | "type" => Self::Brand,
"name" => Self::Name,
"email" => Self::Email,
"address1" => Self::Address1,
"address2" => Self::Address2,
"address3" => Self::Address3,
"address" => Self::Address,
"fingerprint" => Self::Fingerprint,
"public_key" => Self::PublicKey,
"private_key" => Self::PrivateKey,
"title" => Self::Title,
"first_name" => Self::FirstName,
"middle_name" => Self::MiddleName,
"last_name" => Self::LastName,
_ => crate::bin_error::bail!("unknown field {s}"),
})
}
}
impl Field {
fn as_str(&self) -> &str {
match self {
Self::Notes => "notes",
Self::Username => "username",
Self::Password => "password",
Self::Totp => "totp",
Self::Uris => "uris",
Self::IdentityName => "identityname",
Self::City => "city",
Self::State => "state",
Self::PostalCode => "postcode",
Self::Country => "country",
Self::Phone => "phone",
Self::Ssn => "ssn",
Self::License => "license",
Self::Passport => "passport",
Self::CardNumber => "number",
Self::Expiration => "exp",
Self::ExpMonth => "exp_month",
Self::ExpYear => "exp_year",
Self::Cvv => "cvv",
Self::Cardholder => "cardholder",
Self::Brand => "brand",
Self::Name => "name",
Self::Email => "email",
Self::Address1 => "address1",
Self::Address2 => "address2",
Self::Address3 => "address3",
Self::Address => "address",
Self::Fingerprint => "fingerprint",
Self::PublicKey => "public_key",
Self::PrivateKey => "private_key",
Self::Title => "title",
Self::FirstName => "first_name",
Self::MiddleName => "middle_name",
Self::LastName => "last_name",
}
}
}
impl std::fmt::Display for Field {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.as_str())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(super) enum ListField {
Id,
Name,
User,
Folder,
Uri,
EntryType,
}
impl ListField {
pub(super) fn all() -> Vec<Self> {
vec![
Self::Id,
Self::Name,
Self::User,
Self::Folder,
Self::Uri,
Self::EntryType,
]
}
}
impl std::convert::TryFrom<&String> for ListField {
type Error = crate::bin_error::Error;
fn try_from(s: &String) -> bin_error::Result<Self> {
Ok(match s.as_str() {
"name" => Self::Name,
"id" => Self::Id,
"user" => Self::User,
"folder" => Self::Folder,
"type" => Self::EntryType,
_ => return Err(crate::bin_error::err!("unknown field {s}")),
})
}
}