use std::sync::{Arc, Mutex};
use crate::{
ledger::{
connect::{
LedgerKey,
speculos_api::Speculos
}
},
errors::HWKeyError,
};
pub struct LedgerSpeculosKey {
speculos: Arc<Mutex<Speculos>>,
}
impl LedgerSpeculosKey {
pub fn from_env() -> Result<Self, HWKeyError> {
Self::create()
}
pub fn new(host: &str, port: u16) -> Result<Self, HWKeyError> {
Ok(Self {
speculos: Arc::new(Mutex::new(Speculos::new(host, port))),
})
}
pub fn have_device(&self) -> bool {
let conn = self.open_exclusive();
if conn.is_err() {
return false
}
let conn = conn.unwrap();
let conn = conn.lock();
if conn.is_err() {
return false
}
let conn = conn.unwrap();
conn.is_available().unwrap_or_default()
}
}
impl LedgerKey for LedgerSpeculosKey {
type Transport = Speculos;
fn create() -> Result<Self, HWKeyError> {
Ok(Self {
speculos: Arc::new(Mutex::new(Speculos::from_env())),
})
}
fn connect(&mut self) -> Result<(), HWKeyError> {
let conn = self.open_exclusive()?;
let conn = conn.lock();
if conn.is_err() {
return Err(HWKeyError::Unavailable)
}
let conn = conn.unwrap();
let connected = conn.is_available()?;
if connected {
Ok(())
} else {
Err(HWKeyError::Unavailable)
}
}
fn open_exclusive(&self) -> Result<Arc<Mutex<Speculos>>, HWKeyError> {
Ok(self.speculos.clone())
}
}