use strum::{Display, EnumString};
use crate::Filters;
use super::transport;
#[derive(Clone, PartialEq, Debug)]
pub struct LedgerInfo {
pub model: Model,
pub conn: ConnInfo,
}
impl std::fmt::Display for LedgerInfo {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{} ({})", self.model, self.conn)
}
}
impl LedgerInfo {
pub fn kind(&self) -> ConnType {
match &self.conn {
#[cfg(feature = "transport_usb")]
ConnInfo::Usb(_) => ConnType::Usb,
#[cfg(feature = "transport_tcp")]
ConnInfo::Tcp(_) => ConnType::Tcp,
#[cfg(feature = "transport_ble")]
ConnInfo::Ble(_) => ConnType::Ble,
}
}
}
#[derive(Clone, PartialEq, Debug, Display, EnumString)]
pub enum Model {
NanoS,
NanoSPlus,
NanoX,
Stax,
Unknown(u16),
}
impl Model {
pub fn from_pid(pid: u16) -> Model {
match pid & 0xFF00 {
0x4000 => Model::NanoX,
0x5000 => Model::NanoSPlus,
_ => Model::Unknown(pid),
}
}
}
#[derive(Clone, PartialEq, Debug)]
pub enum ConnInfo {
#[cfg(feature = "transport_usb")]
Usb(transport::UsbInfo),
#[cfg(feature = "transport_tcp")]
Tcp(transport::TcpInfo),
#[cfg(feature = "transport_ble")]
Ble(transport::BleInfo),
}
#[derive(Copy, Clone, PartialEq, Debug)]
pub enum ConnType {
Usb,
Tcp,
Ble,
}
impl From<ConnType> for Filters {
fn from(value: ConnType) -> Self {
match value {
ConnType::Usb => Filters::Hid,
ConnType::Tcp => Filters::Tcp,
ConnType::Ble => Filters::Ble,
}
}
}
impl std::fmt::Display for ConnInfo {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
#[cfg(feature = "transport_usb")]
Self::Usb(i) => write!(f, "HID {}", i),
#[cfg(feature = "transport_tcp")]
Self::Tcp(i) => write!(f, "TCP {}", i),
#[cfg(feature = "transport_ble")]
Self::Ble(i) => write!(f, "BLE {}", i),
}
}
}
#[cfg(feature = "transport_usb")]
impl From<transport::UsbInfo> for ConnInfo {
fn from(value: transport::UsbInfo) -> Self {
Self::Usb(value)
}
}
#[cfg(feature = "transport_tcp")]
impl From<transport::TcpInfo> for ConnInfo {
fn from(value: transport::TcpInfo) -> Self {
Self::Tcp(value)
}
}
#[cfg(feature = "transport_ble")]
impl From<transport::BleInfo> for ConnInfo {
fn from(value: transport::BleInfo) -> Self {
Self::Ble(value)
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct AppInfo {
pub name: String,
pub version: String,
pub flags: ledger_proto::apdus::AppFlags,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DeviceInfo {
pub target_id: [u8; 4],
pub se_version: String,
pub mcu_version: String,
pub flags: Vec<u8>,
}