#![allow(
dead_code,
reason = "модуль компилируется отдельно для каждого примера, поэтому часть API используется в соседних примерах"
)]
use escpos_vfd::{Preset, VfdConfig};
use std::error::Error;
use std::str::FromStr;
use std::vec::IntoIter;
const DEFAULT_PORT: &str = "/dev/cu.usbmodem101";
const DEFAULT_WIDTH: usize = 20;
pub struct ExampleArgs {
pub config: VfdConfig,
pub columns: usize,
remaining: IntoIter<String>,
}
impl ExampleArgs {
pub fn from_env() -> Result<Self, Box<dyn Error>> {
let mut values = std::env::args().skip(1);
let port_name = values.next().unwrap_or_else(|| DEFAULT_PORT.to_string());
let columns = values
.next()
.and_then(|value| value.parse().ok())
.unwrap_or(DEFAULT_WIDTH);
let config = preset_config(port_name, columns)?;
Ok(Self {
columns,
config,
remaining: values.collect::<Vec<_>>().into_iter(),
})
}
pub fn parse_or<T>(&mut self, default: T) -> T
where
T: FromStr,
{
self.remaining
.next()
.and_then(|value| value.parse().ok())
.unwrap_or(default)
}
pub fn string_or(&mut self, default: &str) -> String {
self.remaining.next().unwrap_or_else(|| default.to_string())
}
}
pub fn sleep_ms(delay_ms: u64) {
std::thread::sleep(std::time::Duration::from_millis(delay_ms));
}
pub fn preset_config(
port_name: impl Into<String>,
columns: usize,
) -> Result<VfdConfig, Box<dyn Error>> {
let mut config = VfdConfig::preset(port_name, Preset::Epson20x2Cp866)?;
config.display.columns = columns;
config.validate()?;
Ok(config)
}