prehnite/
main.rs

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}