From dd252d584d334eb825b878a751fe4a62a16d3e37 Mon Sep 17 00:00:00 2001 From: pan93412 Date: Thu, 6 Apr 2023 10:17:33 +0800 Subject: [PATCH] =?UTF-8?q?:art:=20(app)=20=E7=94=A8=20PlatformSpecific=20?= =?UTF-8?q?=E4=BB=A3=E6=9B=BF=E5=88=B0=E5=A4=84=E5=88=A4=E6=96=AD=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 以往需要跨平台不同值时,我们都是到处进行 cfg-target 判断。 由于代码片段都是重复的,因此这个 commit 把所有相关的跨平台结构 全部整合在一个结构 (PlatformSpecific) 内,这样除了更容易制造 规范的接口,还可以提升维护的效率(而不用到处修改相关的判断逻辑)。 --- src-tauri/src/app/config.rs | 52 +++++++++++++++++++++---------------- src-tauri/src/app/window.rs | 9 ++----- src-tauri/src/util.rs | 1 - 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/src-tauri/src/app/config.rs b/src-tauri/src/app/config.rs index 4a29895..0119218 100644 --- a/src-tauri/src/app/config.rs +++ b/src-tauri/src/app/config.rs @@ -12,19 +12,37 @@ pub struct WindowConfig { } #[derive(Debug, Deserialize)] -pub struct UserAgent { - pub macos: String, - pub linux: String, - pub windows: String, +pub struct PlatformSpecific { + pub macos: T, + pub linux: T, + pub windows: T, } -#[derive(Debug, Deserialize)] -pub struct FunctionON { - pub macos: bool, - pub linux: bool, - pub windows: bool, +impl PlatformSpecific { + pub const fn get(&self) -> &T { + #[cfg(target_os = "macos")] + let platform = &self.macos; + #[cfg(target_os = "linux")] + let platform = &self.linux; + #[cfg(target_os = "windows")] + let platform = &self.windows; + + platform + } } +impl PlatformSpecific +where + T: Copy, +{ + pub const fn copied(&self) -> T { + *self.get() + } +} + +pub type UserAgent = PlatformSpecific; +pub type FunctionON = PlatformSpecific; + #[derive(Debug, Deserialize)] pub struct PakeConfig { pub windows: Vec, @@ -35,23 +53,11 @@ pub struct PakeConfig { impl PakeConfig { pub fn show_menu(&self) -> bool { - #[cfg(target_os = "macos")] - let menu_status = self.menu.macos; - #[cfg(target_os = "linux")] - let menu_status = self.menu.linux; - #[cfg(target_os = "windows")] - let menu_status = self.menu.windows; - menu_status + self.menu.copied() } #[cfg(not(target_os = "macos"))] pub fn show_system_tray(&self) -> bool { - #[cfg(target_os = "macos")] - let tray_status = self.system_tray.macos; - #[cfg(target_os = "linux")] - let tray_status = self.system_tray.linux; - #[cfg(target_os = "windows")] - let tray_status = self.system_tray.windows; - tray_status + self.menu.copied() } } diff --git a/src-tauri/src/app/window.rs b/src-tauri/src/app/window.rs index a2fca5b..533874d 100644 --- a/src-tauri/src/app/window.rs +++ b/src-tauri/src/app/window.rs @@ -11,17 +11,12 @@ pub fn get_window(app: &mut App, config: PakeConfig, _data_dir: PathBuf) -> Wind .first() .expect("At least one window configuration is required"); - #[cfg(target_os = "macos")] - let user_agent = config.user_agent.macos.as_str(); - #[cfg(target_os = "linux")] - let user_agent = config.user_agent.linux.as_str(); - #[cfg(target_os = "windows")] - let user_agent = config.user_agent.windows.as_str(); + let user_agent = config.user_agent.get(); let url = match window_config.url_type.as_str() { "web" => WindowUrl::App(window_config.url.parse().unwrap()), "local" => WindowUrl::App(PathBuf::from(&window_config.url)), - _ => panic!("url type only can be web or local"), + _ => panic!("url type can only be web or local"), }; let mut window_builder = WindowBuilder::new(app, "pake", url) diff --git a/src-tauri/src/util.rs b/src-tauri/src/util.rs index 2596e9e..1d421a4 100644 --- a/src-tauri/src/util.rs +++ b/src-tauri/src/util.rs @@ -34,4 +34,3 @@ pub fn get_data_dir(_tauri_config: Config) -> PathBuf { PathBuf::new() } } -