streamdeck_oxide/
run.rs

1use std::sync::Arc;
2
3use elgato_streamdeck::AsyncStreamDeck;
4
5use crate::{
6    button::RenderConfig,
7    navigation::NavigationEntry,
8    theme::Theme,
9    view::DisplayManager,
10};
11
12/// Run a Stream Deck application with the specified configuration.
13///
14/// This function takes a theme, render configuration, Stream Deck instance,
15/// and application context, and runs the main event loop.
16pub async fn run<N, W, H, C>(
17    theme: Theme,
18    config: RenderConfig,
19    deck: Arc<AsyncStreamDeck>,
20    context: C,
21) -> Result<(), Box<dyn std::error::Error>>
22where
23    W: generic_array::ArrayLength,
24    H: generic_array::ArrayLength,
25    C: Send + Sync + Clone + 'static,
26    N: NavigationEntry<W, H, C>,
27{
28    let (display_manager, mut navigation_receiver) =
29        DisplayManager::<N, W, H, C>::new(deck.clone(), config, theme, context)?;
30
31    display_manager.fetch_all().await?;
32    display_manager.render().await?;
33
34    let reader = deck.get_reader();
35    loop {
36        let events_future = reader.read(10.0);
37        let navigation_future = navigation_receiver.recv();
38        tokio::select! {
39            events = events_future => {
40                let events = events?;
41                for event in events {
42                    match event {
43                        elgato_streamdeck::DeviceStateUpdate::ButtonDown(id) => {
44                            display_manager.on_press(id).await?;
45                        }
46                        elgato_streamdeck::DeviceStateUpdate::ButtonUp(id) => {
47                            display_manager.on_release(id).await?;
48                        }
49                        _ => {}
50                    }
51                }
52            }
53            Some(navigation) = navigation_future => {
54                display_manager.navigate_to(navigation).await?;
55                display_manager.fetch_all().await?;
56                display_manager.render().await?;
57            }
58        }
59    }
60}