22// 主入口文件,负责解析CLI参数并分派到相应处理函数
33
44use std:: error:: Error ;
5- use std:: env;
6- use std:: fs;
7- use std:: path:: Path ;
85
96use clap:: Parser ;
107
118use crate :: cli:: Cli ;
129use crate :: context:: Context ;
1310use crate :: handlers:: handle_command;
1411use crate :: repl:: run_repl;
15- use file_classification_core:: utils;
12+ use file_classification_core:: utils:: database;
13+ // 引入环境变量加载工具
14+ use file_classification_common:: env_loader:: load_env_file;
1615
1716mod cli;
1817mod context;
@@ -22,59 +21,6 @@ mod interactive;
2221mod parsers;
2322mod repl;
2423
25- /// 加载环境变量文件
26- ///
27- /// 加载顺序:
28- /// 1. 通过 ENV_FILE 环境变量指定的文件
29- /// 2. 回退到 .file_classification_env
30- /// 3. 如果以上都不存在,则创建带有默认配置的 .file_classification_env
31- fn load_env_file ( ) -> Result < Option < String > , Box < dyn std:: error:: Error > > {
32- // 首先检查是否通过环境变量指定了env文件
33- let env_file = env:: var ( "ENV_FILE" ) . unwrap_or_else ( |_| ".file_classification_env" . to_string ( ) ) ;
34-
35- // 尝试加载指定的env文件
36- if Path :: new ( & env_file) . exists ( ) {
37- dotenvy:: dotenv_override ( ) . ok ( ) ;
38- dotenvy:: from_filename_override ( & env_file) ?;
39- Ok ( Some ( env_file) )
40- } else if env_file != ".file_classification_env" && Path :: new ( ".file_classification_env" ) . exists ( ) {
41- // 如果指定了自定义env文件但不存在,回退到.file_classification_env
42- dotenvy:: dotenv_override ( ) . ok ( ) ;
43- dotenvy:: from_filename_override ( ".file_classification_env" ) ?;
44- Ok ( Some ( ".file_classification_env" . to_string ( ) ) )
45- } else {
46- // 如果文件都不存在,创建默认的.file_classification_env
47- create_default_env_file ( ) ?;
48- dotenvy:: dotenv_override ( ) . ok ( ) ;
49- dotenvy:: from_filename_override ( ".file_classification_env" ) ?;
50- Ok ( None )
51- }
52- }
53-
54- /// 创建默认的环境变量配置文件
55- fn create_default_env_file ( ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
56- let default_content = r#"# File Classification 系统配置文件
57- # 数据库配置
58- DATABASE_URL=file_classification.db
59- DATABASE_TYPE=sqlite
60-
61- # Web API 配置
62- BIND_ADDRESS=127.0.0.1
63- BIND_PORT=8082
64-
65- # 日志配置
66- RUST_LOG=info
67- RUST_LOG_FILE=debug
68-
69- # CORS 配置
70- CORS_ENABLED=true
71- CORS_ORIGIN=http://localhost:8082
72- "# ;
73-
74- fs:: write ( ".file_classification_env" , default_content) ?;
75- Ok ( ( ) )
76- }
77-
7824/// 主函数:解析命令行参数,初始化数据库连接和上下文,并处理命令
7925fn main ( ) -> Result < ( ) , Box < dyn Error > > {
8026 let cli = Cli :: parse ( ) ;
@@ -88,10 +34,10 @@ fn main() -> Result<(), Box<dyn Error>> {
8834 let database_url = std:: env:: var ( "DATABASE_URL" ) . expect ( "DATABASE_URL must be set" ) ;
8935 let database_type = std:: env:: var ( "DATABASE_TYPE" ) . expect ( "DATABASE_TYPE must be set" ) ;
9036
91- let mut conn = utils :: database:: establish_connection ( & database_url, & database_type) ;
37+ let mut conn = database:: establish_connection ( & database_url, & database_type) ;
9238
9339 // 运行待处理的数据库迁移
94- if let Err ( e) = utils :: database:: run_pending_migrations ( & mut conn) {
40+ if let Err ( e) = database:: run_pending_migrations ( & mut conn) {
9541 eprintln ! ( "数据库迁移失败: {}" , e) ;
9642 return Err ( e) ;
9743 }
0 commit comments