Skip to main content

eoka_server/
state.rs

1use std::collections::HashMap;
2use std::sync::Arc;
3
4use eoka::{Browser, Page};
5
6use crate::protocol::ServerError;
7
8#[derive(Default)]
9pub struct AppState {
10    browser: Option<Arc<Browser>>,
11    pages: HashMap<String, Page>,
12    shutdown: bool,
13}
14
15impl AppState {
16    pub fn new() -> Self {
17        Self::default()
18    }
19
20    pub fn set_browser(&mut self, browser: Browser) {
21        self.browser = Some(Arc::new(browser));
22    }
23
24    pub fn take_browser(&mut self) -> Option<Arc<Browser>> {
25        self.browser.take()
26    }
27
28    pub fn is_launched(&self) -> bool {
29        self.browser.is_some()
30    }
31
32    pub fn browser(&self) -> Result<&Arc<Browser>, ServerError> {
33        self.browser
34            .as_ref()
35            .ok_or_else(|| ServerError::internal("browser not launched; call browser.launch first"))
36    }
37
38    pub fn insert_page(&mut self, id: String, page: Page) {
39        self.pages.insert(id, page);
40    }
41
42    pub fn remove_page(&mut self, id: &str) -> Option<Page> {
43        self.pages.remove(id)
44    }
45
46    pub fn page(&self, id: &str) -> Result<&Page, ServerError> {
47        self.pages
48            .get(id)
49            .ok_or_else(|| ServerError::invalid_page(id))
50    }
51
52    pub fn clear_pages(&mut self) {
53        self.pages.clear();
54    }
55
56    pub fn mark_shutdown(&mut self) {
57        self.shutdown = true;
58    }
59
60    pub fn should_shutdown(&self) -> bool {
61        self.shutdown
62    }
63}