use rs1541::{Cbm, Error};
use std::fmt;
use std::sync::Arc;
use tokio;
#[derive(Debug)]
struct TaskError(String);
impl fmt::Display for TaskError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "Task error: {}", self.0)
}
}
impl std::error::Error for TaskError {}
#[tokio::main]
async fn main() -> Result<(), Error> {
env_logger::init();
let cbm = Arc::new(Cbm::new(None, None)?);
let cbm1 = Arc::clone(&cbm);
let task1 = tokio::spawn(async move {
let id = cbm1.identify(8).map_err(|e| TaskError(e.to_string()))?;
println!("Task 1 - Drive type at device 8: {}", id);
let dir = cbm1.dir(8, None).map_err(|e| TaskError(e.to_string()))?;
println!("Task 1 - Directory listing:\n{}", dir);
Ok::<(), TaskError>(())
});
let cbm2 = Arc::clone(&cbm);
let task2 = tokio::spawn(async move {
for i in 1..=3 {
let status = cbm2.get_status(8).map_err(|e| TaskError(e.to_string()))?;
println!("Task 2 (iteration {}) - Drive status: {}", i, status);
tokio::time::sleep(tokio::time::Duration::from_millis(100)).await;
}
Ok::<(), TaskError>(())
});
let (result1, result2) = tokio::join!(task1, task2);
let _ = result1
.unwrap()
.inspect_err(|e| println!("Task 1 error: {}", e));
let _ = result2
.unwrap()
.inspect_err(|e| println!("Task 2 error: {}", e));
Ok(())
}