1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
use nusb::DeviceInfo;

use crate::PRODUCT_ID_DATA;
use crate::PRODUCT_ID_STORAGE;


#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Mode {
	/// DATA / COMM
	Data,
	/// MASS_STORAGE
	Storage,
	Unknown,
}

impl std::fmt::Display for Mode {
	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
		write!(f, "{}", match self {
			Mode::Data => 'D',
			Mode::Storage => 'S',
			Mode::Unknown => '?',
		})
	}
}


pub trait DeviceMode {
	/// USB device mode determined by the product ID.
	fn mode(&self) -> Mode;
}


impl DeviceMode for DeviceInfo {
	fn mode(&self) -> Mode {
		match self.product_id() {
			PRODUCT_ID_DATA => Mode::Data,
			PRODUCT_ID_STORAGE => Mode::Storage,
			_ => Mode::Unknown,
		}
	}
}


impl DeviceMode for super::Device {
	fn mode(&self) -> Mode { self.info().mode() }
}