visual-cortex 0.9.0

Watch screen regions and receive typed events over async streams when patterns match: OCR, template matching, and pixel conditions on live captures.
//! End-to-end demo against a scripted FakeSource — no real screen needed.
//! Run: cargo run -p visual_cortex --example fake_demo

use visual_cortex::{from_fn, DetectorOutput, FakeSource, Frame, FrameView, Rate, Region, Session};

#[tokio::main]
async fn main() -> visual_cortex::Result<()> {
    // Script: 2 seconds of dark frames, then a bright "banner" appears.
    let mut frames = vec![Frame::solid(320, 180, [20, 20, 20, 255]); 20];
    frames.push(Frame::solid(320, 180, [40, 200, 240, 255])); // BGRA: bright, R=240

    let session = Session::builder()
        .source(FakeSource::new(frames))
        .build()
        .await?;

    let mut banner = session
        .watch("banner")
        .region(Region::percent(0.25, 0.25, 0.5, 0.5))
        .rate(Rate::hz(10.0))
        .detector(from_fn(|view: &FrameView<'_>| {
            let first_row = view.rows().next().expect("non-empty view");
            Ok(DetectorOutput::Bool(first_row[2] > 128))
        }))
        .subscribe()?;

    println!("watching for the banner...");
    for _ in 0..2 {
        if let Some(ev) = banner.next().await {
            println!("[{}] {:?}", &*ev.watcher, ev.kind);
        }
    }
    println!("done");
    Ok(())
}