package version import ( "context" protocolpkg "github.com/noahlann/nnet/pkg/protocol" ) // HeaderIdentifier 基于帧头的版本识别器 type HeaderIdentifier struct { field string offset int mapping map[interface{}]string } // NewHeaderIdentifier 创建基于帧头的版本识别器 func NewHeaderIdentifier(field string, offset int, mapping map[interface{}]string) protocolpkg.VersionIdentifier { return &HeaderIdentifier{ field: field, offset: offset, mapping: mapping, } } // Identify 识别协议版本 func (i *HeaderIdentifier) Identify(data []byte, ctx context.Context) (string, error) { if len(data) < i.offset+1 { return "", protocolpkg.NewError("data too short") } // 从指定偏移量读取版本信息 versionByte := data[i.offset] // 查找映射 if version, ok := i.mapping[versionByte]; ok { return version, nil } return "", protocolpkg.NewError("version not found") } // MessageHeaderIdentifier 基于消息头的版本识别器 type MessageHeaderIdentifier struct { path string mapping map[interface{}]string } // NewMessageHeaderIdentifier 创建基于消息头的版本识别器 func NewMessageHeaderIdentifier(path string, mapping map[interface{}]string) protocolpkg.VersionIdentifier { return &MessageHeaderIdentifier{ path: path, mapping: mapping, } } // Identify 识别协议版本 func (i *MessageHeaderIdentifier) Identify(data []byte, ctx context.Context) (string, error) { // 这里需要解析消息头,实际实现可能需要根据具体的消息格式来解析 // 简化实现:假设消息头包含版本信息 if len(data) < 1 { return "", protocolpkg.NewError("data too short") } versionByte := data[0] if version, ok := i.mapping[versionByte]; ok { return version, nil } return "", protocolpkg.NewError("version not found") } // CustomIdentifier 自定义版本识别器 type CustomIdentifier struct { fn func(data []byte, ctx context.Context) (string, error) } // NewCustomIdentifier 创建自定义版本识别器 func NewCustomIdentifier(fn func(data []byte, ctx context.Context) (string, error)) protocolpkg.VersionIdentifier { return &CustomIdentifier{ fn: fn, } } // Identify 识别协议版本 func (i *CustomIdentifier) Identify(data []byte, ctx context.Context) (string, error) { if i.fn == nil { return "", protocolpkg.NewError("identifier function is nil") } return i.fn(data, ctx) }