use std::convert;
use crate::error::{Error, LibraryError};
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct Config {
pub num_lock: Option<u8>,
pub caps_lock: Option<u8>,
pub scroll_lock: Option<u8>,
pub user_password: bool,
}
fn config_otp_slot_to_option(value: u8) -> Option<u8> {
if value < 3 {
Some(value)
} else {
None
}
}
fn option_to_config_otp_slot(value: Option<u8>) -> Result<u8, Error> {
if let Some(value) = value {
if value < 3 {
Ok(value)
} else {
Err(LibraryError::InvalidSlot.into())
}
} else {
Ok(255)
}
}
impl Config {
pub fn new(
num_lock: Option<u8>,
caps_lock: Option<u8>,
scroll_lock: Option<u8>,
user_password: bool,
) -> Config {
Config {
num_lock,
caps_lock,
scroll_lock,
user_password,
}
}
fn from_raw(numlock: u8, capslock: u8, scrollock: u8, user_password: bool) -> Config {
Config {
num_lock: config_otp_slot_to_option(numlock),
caps_lock: config_otp_slot_to_option(capslock),
scroll_lock: config_otp_slot_to_option(scrollock),
user_password,
}
}
}
impl convert::TryFrom<Config> for nitrokey_sys::NK_config {
type Error = Error;
fn try_from(config: Config) -> Result<nitrokey_sys::NK_config, Error> {
Ok(nitrokey_sys::NK_config {
numlock: option_to_config_otp_slot(config.num_lock)?,
capslock: option_to_config_otp_slot(config.caps_lock)?,
scrolllock: option_to_config_otp_slot(config.scroll_lock)?,
enable_user_password: config.user_password,
disable_user_password: false,
})
}
}
impl From<nitrokey_sys::NK_config> for Config {
fn from(config: nitrokey_sys::NK_config) -> Config {
Config::from_raw(
config.numlock,
config.capslock,
config.scrolllock,
config.enable_user_password,
)
}
}
impl From<&nitrokey_sys::NK_status> for Config {
fn from(status: &nitrokey_sys::NK_status) -> Config {
Config::from_raw(
status.config_numlock,
status.config_capslock,
status.config_scrolllock,
status.otp_user_password,
)
}
}