package zhub import ( "fmt" "log" "sync" ) // Client 客户端包装器 type Client struct { *ZHubClient config *Config } var ( defaultClient *Client once sync.Once ) // InitWithOptions 使用选项初始化默认客户端 func InitWithOptions(opts *ConfigOptions) error { var err error once.Do(func() { config, configErr := LoadConfigWithOptions(opts) if configErr != nil { err = fmt.Errorf("failed to load config: %w", configErr) return } client, clientErr := NewClient(config) if clientErr != nil { err = fmt.Errorf("failed to create client: %w", clientErr) return } defaultClient = client }) return err } // InitWithProjectConfig 使用项目配置文件初始化 func InitWithProjectConfig(projectConfigPath string) error { opts := &ConfigOptions{ ConfigPath: projectConfigPath, ConfigKey: "zhub", } return InitWithOptions(opts) } // NewClient 创建新的客户端实例 func NewClient(config *Config) (*Client, error) { client := &Client{ ZHubClient: &ZHubClient{ Appname: config.Appname, Addr: config.Addr, Groupid: config.Groupid, Auth: config.Auth, }, config: config, } err := client.Start() if err != nil { return nil, err } return client, nil } // DefaultClient 获取默认客户端实例 func DefaultClient() *Client { if defaultClient == nil { log.Panic("zhub client not initialized, call InitWithProjectConfig() first") } return defaultClient } // GetClient 获取客户端实例(如果未初始化则使用默认配置) func GetClient() *Client { if defaultClient == nil { // 尝试从当前目录加载默认配置 opts := &ConfigOptions{ ConfigName: "app", ConfigType: "yml", ConfigKey: "zhub", } if err := InitWithOptions(opts); err != nil { log.Panic("Failed to initialize zhub client:", err) } } return defaultClient }