mirror of
https://github.com/shadow1ng/fscan.git
synced 2025-09-14 14:06:44 +08:00

- 创建app包实现依赖注入容器和初始化器模式 - 重构main.go为六阶段清晰的初始化流程 - 新增结构化错误处理替代简陋的os.Exit调用 - 为HostInfo添加辅助函数增强功能但保持向后兼容 - 引入TargetInfo包装器支持上下文和元数据管理 - 优化代码组织提升可维护性和可测试性
118 lines
2.6 KiB
Go
118 lines
2.6 KiB
Go
package common
|
||
|
||
import (
|
||
"context"
|
||
)
|
||
|
||
// TargetInfo 包装HostInfo,提供更丰富的功能
|
||
type TargetInfo struct {
|
||
*HostInfo // 嵌入HostInfo,保持向后兼容
|
||
context context.Context
|
||
metadata map[string]interface{}
|
||
}
|
||
|
||
// NewTargetInfo 创建新的目标信息
|
||
func NewTargetInfo(hostInfo HostInfo) *TargetInfo {
|
||
return &TargetInfo{
|
||
HostInfo: &hostInfo,
|
||
context: context.Background(),
|
||
metadata: make(map[string]interface{}),
|
||
}
|
||
}
|
||
|
||
// NewTargetInfoFromPtr 从HostInfo指针创建目标信息
|
||
func NewTargetInfoFromPtr(hostInfo *HostInfo) *TargetInfo {
|
||
return &TargetInfo{
|
||
HostInfo: hostInfo,
|
||
context: context.Background(),
|
||
metadata: make(map[string]interface{}),
|
||
}
|
||
}
|
||
|
||
// WithContext 设置上下文
|
||
func (t *TargetInfo) WithContext(ctx context.Context) *TargetInfo {
|
||
t.context = ctx
|
||
return t
|
||
}
|
||
|
||
// GetContext 获取上下文
|
||
func (t *TargetInfo) GetContext() context.Context {
|
||
if t.context == nil {
|
||
t.context = context.Background()
|
||
}
|
||
return t.context
|
||
}
|
||
|
||
// SetMetadata 设置元数据
|
||
func (t *TargetInfo) SetMetadata(key string, value interface{}) *TargetInfo {
|
||
if t.metadata == nil {
|
||
t.metadata = make(map[string]interface{})
|
||
}
|
||
t.metadata[key] = value
|
||
return t
|
||
}
|
||
|
||
// GetMetadata 获取元数据
|
||
func (t *TargetInfo) GetMetadata(key string) (interface{}, bool) {
|
||
if t.metadata == nil {
|
||
return nil, false
|
||
}
|
||
value, exists := t.metadata[key]
|
||
return value, exists
|
||
}
|
||
|
||
// GetAllMetadata 获取所有元数据
|
||
func (t *TargetInfo) GetAllMetadata() map[string]interface{} {
|
||
if t.metadata == nil {
|
||
return make(map[string]interface{})
|
||
}
|
||
// 返回副本,防止外部修改
|
||
result := make(map[string]interface{})
|
||
for k, v := range t.metadata {
|
||
result[k] = v
|
||
}
|
||
return result
|
||
}
|
||
|
||
// Clone 克隆目标信息
|
||
func (t *TargetInfo) Clone() *TargetInfo {
|
||
clonedHost := CloneHostInfo(t.HostInfo)
|
||
cloned := &TargetInfo{
|
||
HostInfo: &clonedHost,
|
||
context: t.context,
|
||
metadata: make(map[string]interface{}),
|
||
}
|
||
|
||
// 复制元数据
|
||
for k, v := range t.metadata {
|
||
cloned.metadata[k] = v
|
||
}
|
||
|
||
return cloned
|
||
}
|
||
|
||
// GetHostInfo 获取原始HostInfo(向后兼容)
|
||
func (t *TargetInfo) GetHostInfo() HostInfo {
|
||
return *t.HostInfo
|
||
}
|
||
|
||
// Validate 验证目标信息
|
||
func (t *TargetInfo) Validate() error {
|
||
return ValidateHostInfo(t.HostInfo)
|
||
}
|
||
|
||
// String 返回字符串表示
|
||
func (t *TargetInfo) String() string {
|
||
return HostInfoString(t.HostInfo)
|
||
}
|
||
|
||
// IsValid 检查目标是否有效
|
||
func (t *TargetInfo) IsValid() bool {
|
||
return t.Validate() == nil
|
||
}
|
||
|
||
// HasMetadata 检查是否有指定的元数据
|
||
func (t *TargetInfo) HasMetadata(key string) bool {
|
||
_, exists := t.GetMetadata(key)
|
||
return exists
|
||
} |