1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
use web_view::WebView; mod runner; type InvokeHandler = Box<dyn FnMut(&mut WebView<'_, ()>, &str) -> Result<(), String>>; type Setup = Box<dyn FnMut(&mut WebView<'_, ()>, String)>; pub struct App { invoke_handler: Option<InvokeHandler>, setup: Option<Setup>, splashscreen_html: Option<String>, } impl App { pub fn run(mut self) { runner::run(&mut self).expect("Failed to build webview"); } pub(crate) fn run_invoke_handler( &mut self, webview: &mut WebView<'_, ()>, arg: &str, ) -> Result<bool, String> { if let Some(ref mut invoke_handler) = self.invoke_handler { invoke_handler(webview, arg).map(|_| true) } else { Ok(false) } } pub(crate) fn run_setup(&mut self, webview: &mut WebView<'_, ()>, source: String) { if let Some(ref mut setup) = self.setup { setup(webview, source); } } pub fn splashscreen_html(&self) -> Option<&String> { self.splashscreen_html.as_ref() } } #[derive(Default)] pub struct AppBuilder { invoke_handler: Option<InvokeHandler>, setup: Option<Setup>, splashscreen_html: Option<String>, } impl AppBuilder { pub fn new() -> Self { Self { invoke_handler: None, setup: None, splashscreen_html: None, } } pub fn invoke_handler<F: FnMut(&mut WebView<'_, ()>, &str) -> Result<(), String> + 'static>( mut self, invoke_handler: F, ) -> Self { self.invoke_handler = Some(Box::new(invoke_handler)); self } pub fn setup<F: FnMut(&mut WebView<'_, ()>, String) + 'static>(mut self, setup: F) -> Self { self.setup = Some(Box::new(setup)); self } pub fn splashscreen_html(mut self, html: &str) -> Self { self.splashscreen_html = Some(html.to_string()); self } pub fn build(self) -> App { App { invoke_handler: self.invoke_handler, setup: self.setup, splashscreen_html: self.splashscreen_html, } } }