diff --git a/src/config/ip2region.rs b/src/config/ip2region.rs new file mode 100644 index 0000000..a69b24f --- /dev/null +++ b/src/config/ip2region.rs @@ -0,0 +1,12 @@ +use serde::Deserialize; +use spring::config::Configurable; + +#[derive(Clone, Deserialize, Configurable)] +#[config_prefix = "ip2region"] +pub struct Ip2RegionConfig { + pub db_path: String, +} + +fn default_db_path() -> String { + "./data/ip2region.xdb".to_string() +} diff --git a/src/config/mod.rs b/src/config/mod.rs index 53c6387..f4620fb 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -2,6 +2,7 @@ pub mod akismet; pub mod comrak; pub mod mail; pub mod auth; +pub mod ip2region; use serde::Deserialize; use spring::config::Configurable; diff --git a/src/main.rs b/src/main.rs index c236daf..e44a549 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,27 +1,26 @@ mod config; -mod views; -mod router; mod model; mod plugins; +mod router; mod service; mod utils; +mod views; -use plugins::{akismet::AkismetPlugin, uaparser::UAParserPlugin}; +use plugins::{akismet::AkismetPlugin, ip2region::Ip2RegionPlugin, uaparser::UAParserPlugin}; use spring::App; use spring_mail::MailPlugin; -use spring_opentelemetry::{KeyValue, OpenTelemetryPlugin, ResourceConfigurator, SERVICE_NAME, SERVICE_VERSION}; +use spring_opentelemetry::{ + KeyValue, OpenTelemetryPlugin, ResourceConfigurator, SERVICE_NAME, SERVICE_VERSION, +}; use spring_redis::RedisPlugin; use spring_sea_orm::SeaOrmPlugin; use spring_web::{WebConfigurator, WebPlugin}; -use xdb::searcher_init; // Init translations for current crate. rust_i18n::i18n!("locales"); #[tokio::main] async fn main() { - let xdb_filepath = "./data/ip2region.xdb"; - searcher_init(Some(xdb_filepath.to_owned())); App::new() .opentelemetry_attrs([ KeyValue::new(SERVICE_NAME, env!("CARGO_PKG_NAME")), @@ -34,6 +33,7 @@ async fn main() { .add_plugin(RedisPlugin) .add_plugin(AkismetPlugin) .add_plugin(UAParserPlugin) + .add_plugin(Ip2RegionPlugin) .add_router(router::router()) .run() .await diff --git a/src/plugins/ip2region.rs b/src/plugins/ip2region.rs new file mode 100644 index 0000000..5062f24 --- /dev/null +++ b/src/plugins/ip2region.rs @@ -0,0 +1,15 @@ +use crate::config::ip2region::Ip2RegionConfig; +use spring::{app::AppBuilder, async_trait, config::ConfigRegistry, plugin::Plugin}; +use xdb::searcher_init; + +pub struct Ip2RegionPlugin; + +#[async_trait] +impl Plugin for Ip2RegionPlugin { + async fn build(&self, app: &mut AppBuilder) { + let config = app + .get_config::() + .expect("ip2region config is invalid"); + searcher_init(Some(config.db_path)); + } +} diff --git a/src/plugins/mod.rs b/src/plugins/mod.rs index ebed892..ef489a2 100644 --- a/src/plugins/mod.rs +++ b/src/plugins/mod.rs @@ -1,2 +1,3 @@ pub mod akismet; -pub mod uaparser; \ No newline at end of file +pub mod uaparser; +pub mod ip2region; \ No newline at end of file