1#![cfg_attr(feature = "release", windows_subsystem = "windows")]
2mod app;
3mod util;
4pub mod widget;
5
6use crate::app::PrehniteApp;
7use prehnite_core::db::{initialize_db, DBType, DatabaseError};
8use prehnite_core::font::get_default_font_family;
9use prehnite_core::i18n::initialize_i18n_from_db;
10use prehnite_core::log::initialize_logger;
11use prehnite_core::settings::registry::SettingRegistry;
12use prehnite_core::settings::GlobalSettingKey;
13use prehnite_core::util::alert::{
14 fatal_initialize_app_error_db, fatal_initialize_setting_registry_error,
15};
16use std::fmt::Debug;
17use thiserror::Error;
18use tracing::error;
19use tracing_unwrap::ResultExt;
20
21#[derive(Debug, Error)]
22enum InitializeError {
23 #[error("initialize error. because database")]
24 DatabaseError(#[from] DatabaseError),
25 #[error("initialize error. because can not load setting registry")]
26 LoadSettingRegistry,
27 #[error("failed to initialize log rotate.")]
28 InitializeLogRotateConfig(#[from] prehnite_core::log::InitError),
29}
30
31impl From<sqlx::Error> for InitializeError {
32 fn from(value: sqlx::Error) -> Self {
33 DatabaseError::from(value).into()
34 }
35}
36
37#[tokio::main]
38#[tracing::instrument]
39async fn initializer() {
40 async fn func() -> Result<(), InitializeError> {
41 initialize_logger()?;
42 initialize_db().await?;
43 if !SettingRegistry::load(DBType::AppGlobal).await {
44 return Err(InitializeError::LoadSettingRegistry);
45 };
46 initialize_i18n_from_db().await?;
47 if let None =
48 SettingRegistry::get(&GlobalSettingKey::Font.into()).and_then(|v| v.get::<String>())
49 {
50 SettingRegistry::immediate_apply(
51 GlobalSettingKey::Font.into(),
52 get_default_font_family().into(),
53 )
54 .await?;
55 }
56 Ok(())
57 }
58
59 func().await.unwrap_or_else(|e| {
60 let err_msg = format!("{:#?}", e);
61 error!("{}", err_msg);
62 match e {
63 InitializeError::DatabaseError(_) | InitializeError::InitializeLogRotateConfig(_) => {
64 fatal_initialize_app_error_db(e).show().unwrap_or_log();
65 }
66 InitializeError::LoadSettingRegistry => {
67 fatal_initialize_setting_registry_error()
68 .show()
69 .unwrap_or_log();
70 }
71 }
72 panic!()
73 });
74}
75
76fn main() -> Result<(), iced::Error> {
77 initializer();
78 PrehniteApp::run()
79}