use futures_util::stream::StreamExt;
use rs2_stream::rs2::*;
use std::fs::File;
use std::io::{BufRead, BufReader};
use std::path::PathBuf;
use tokio::runtime::Runtime;
async fn acquire_resource() -> PathBuf {
println!("Resource acquired: data.txt");
PathBuf::from("data.txt")
}
async fn release_resource(path: PathBuf) {
println!("Resource released: {}", path.display());
}
fn use_resource(path: PathBuf) -> RS2Stream<String> {
let file = match File::open(&path) {
Ok(file) => file,
Err(e) => {
eprintln!("Error opening file: {}", e);
return empty();
}
};
let reader = BufReader::new(file);
let lines = reader.lines().filter_map(Result::ok);
from_iter(lines)
}
fn main() {
std::fs::write("data.txt", "Line 1\nLine 2\nLine 3\n").expect("Failed to create data.txt");
let rt = Runtime::new().unwrap();
rt.block_on(async {
println!("Using bracket_rs extension method for resource management");
let result = empty::<i32>()
.bracket_rs(
acquire_resource(),
|reader| use_resource(reader),
release_resource,
)
.collect::<Vec<_>>()
.await;
println!("Lines: {:?}", result);
});
std::fs::remove_file("data.txt").expect("Failed to remove data.txt");
}