fscan/main.go
ZacharyZcR b463984e78 refactor: 重构main.go入口文件并引入依赖注入架构
- 创建app包实现依赖注入容器和初始化器模式
- 重构main.go为六阶段清晰的初始化流程
- 新增结构化错误处理替代简陋的os.Exit调用
- 为HostInfo添加辅助函数增强功能但保持向后兼容
- 引入TargetInfo包装器支持上下文和元数据管理
- 优化代码组织提升可维护性和可测试性
2025-08-12 14:37:28 +08:00

63 lines
1.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"context"
"fmt"
"os"
"github.com/shadow1ng/fscan/app"
"github.com/shadow1ng/fscan/common"
)
func main() {
// 创建应用容器
container := app.NewContainer()
// 第一阶段:基础初始化(插件系统)
if err := container.Initialize(); err != nil {
handleError("基础初始化失败", err)
}
defer container.Cleanup()
// 第二阶段:解析配置
var info common.HostInfo
common.Flag(&info)
// 第三阶段日志初始化依赖于flag解析
logInit := &app.LoggerInitializer{}
if err := logInit.Initialize(); err != nil {
handleError("日志初始化失败", err)
}
// 第四阶段:参数解析和验证
if err := common.Parse(&info); err != nil {
handleError("参数解析失败", err)
}
// 第五阶段:输出系统初始化
outputInit := &app.OutputInitializer{}
if err := outputInit.Initialize(); err != nil {
handleError("输出初始化失败", err)
}
// 第六阶段:执行扫描
ctx := context.Background()
if err := container.RunScan(ctx, info); err != nil {
handleError("扫描失败", err)
}
}
func handleError(msg string, err error) {
// 检查是否是应用程序错误
if appErr, ok := err.(*app.AppError); ok {
common.LogError(fmt.Sprintf("%s: %s", msg, appErr.Message))
if appErr.Cause != nil {
common.LogError(fmt.Sprintf("详细错误: %v", appErr.Cause))
}
os.Exit(appErr.Code)
} else {
common.LogError(fmt.Sprintf("%s: %v", msg, err))
os.Exit(1)
}
}