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}