hw-wallet 0.1.2

Shared wallet orchestration utilities for CLI and FFI
Documentation
use trezor_connect::thp::{Phase, ThpState};

#[derive(Debug, Clone, Copy, Eq, PartialEq)]
pub enum SessionPhase {
    NeedsChannel,
    NeedsHandshake,
    NeedsPairingCode,
    NeedsConnectionConfirmation,
    NeedsSession,
    Ready,
}

impl SessionPhase {
    pub fn from_state(state: &ThpState, session_ready: bool) -> Self {
        match state.phase() {
            Phase::Handshake if state.has_channel() => Self::NeedsHandshake,
            Phase::Handshake => Self::NeedsChannel,
            Phase::Pairing if state.is_paired() => Self::NeedsConnectionConfirmation,
            Phase::Pairing => Self::NeedsPairingCode,
            Phase::Paired if session_ready => Self::Ready,
            Phase::Paired => Self::NeedsSession,
        }
    }
}

#[derive(Debug, Clone, Eq, PartialEq)]
pub struct SessionState {
    pub phase: SessionPhase,
    pub can_pair_only: bool,
    pub can_connect: bool,
    pub can_get_address: bool,
    pub can_sign_tx: bool,
    pub requires_pairing_code: bool,
    pub prompt_message: Option<String>,
}

impl SessionState {
    pub fn new(phase: SessionPhase, prompt_message: Option<String>) -> Self {
        let ready = phase == SessionPhase::Ready;
        Self {
            phase,
            can_pair_only: !ready,
            can_connect: !ready,
            can_get_address: ready,
            can_sign_tx: ready,
            requires_pairing_code: phase == SessionPhase::NeedsPairingCode,
            prompt_message,
        }
    }
}