From cab4266e45327469073f8e447276a095c7a0f1e4 Mon Sep 17 00:00:00 2001 From: daiyb <570956418@qq.com> Date: Tue, 21 Oct 2025 14:54:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/cast/cast.pb.go | 203 ++++++++++++++++++++++------------- api/cast/cast.pb.validate.go | 142 +++++++++++++++++++++++- 2 files changed, 268 insertions(+), 77 deletions(-) diff --git a/api/cast/cast.pb.go b/api/cast/cast.pb.go index 04cab25..a2cf8ff 100644 --- a/api/cast/cast.pb.go +++ b/api/cast/cast.pb.go @@ -1904,6 +1904,7 @@ type UpdateStatusReq struct { ConfirmStatus uint32 `protobuf:"varint,5,opt,name=confirmStatus,proto3" json:"confirmStatus"` ApprovalReply string `protobuf:"bytes,6,opt,name=approvalReply,proto3" json:"approvalReply"` AutoPublish AutoPublishENUM `protobuf:"varint,7,opt,name=autoPublish,proto3,enum=Cast.AutoPublishENUM" json:"autoPublish"` + CostType uint32 `protobuf:"varint,8,opt,name=costType,proto3" json:"costType"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -1987,6 +1988,13 @@ func (x *UpdateStatusReq) GetAutoPublish() AutoPublishENUM { return AutoPublishENUM_AutoPublish_UNKONW } +func (x *UpdateStatusReq) GetCostType() uint32 { + if x != nil { + return x.CostType + } + return 0 +} + type MediaAccountsReq struct { state protoimpl.MessageState `protogen:"open.v1"` ArtistUuid string `protobuf:"bytes,1,opt,name=artistUuid,proto3" json:"artistUuid"` @@ -2189,7 +2197,7 @@ func (x *MediaWorksResp) GetData() []*MediaWorksResp_Info { type PublishReq struct { state protoimpl.MessageState `protogen:"open.v1"` - WorkUuid string `protobuf:"bytes,1,opt,name=workUuid,proto3" json:"workUuid"` + WorkUuids []string `protobuf:"bytes,1,rep,name=workUuids,proto3" json:"workUuids"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -2224,17 +2232,16 @@ func (*PublishReq) Descriptor() ([]byte, []int) { return file_pb_fiee_cast_proto_rawDescGZIP(), []int{23} } -func (x *PublishReq) GetWorkUuid() string { +func (x *PublishReq) GetWorkUuids() []string { if x != nil { - return x.WorkUuid + return x.WorkUuids } - return "" + return nil } type PublishResp struct { state protoimpl.MessageState `protogen:"open.v1"` - ArtistUuid string `protobuf:"bytes,1,opt,name=artistUuid,proto3" json:"artistUuid"` - WorkCategory int32 `protobuf:"varint,2,opt,name=workCategory,proto3" json:"workCategory"` + Data []*PublishResp_Info `protobuf:"bytes,1,rep,name=data,proto3" json:"data"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -2269,18 +2276,11 @@ func (*PublishResp) Descriptor() ([]byte, []int) { return file_pb_fiee_cast_proto_rawDescGZIP(), []int{24} } -func (x *PublishResp) GetArtistUuid() string { +func (x *PublishResp) GetData() []*PublishResp_Info { if x != nil { - return x.ArtistUuid + return x.Data } - return "" -} - -func (x *PublishResp) GetWorkCategory() int32 { - if x != nil { - return x.WorkCategory - } - return 0 + return nil } type RePublishReq struct { @@ -3460,6 +3460,58 @@ func (x *MediaWorksResp_Info) GetCoverUrl() string { return "" } +type PublishResp_Info struct { + state protoimpl.MessageState `protogen:"open.v1"` + ArtistUuid string `protobuf:"bytes,1,opt,name=artistUuid,proto3" json:"artistUuid"` + WorkCategory int32 `protobuf:"varint,2,opt,name=workCategory,proto3" json:"workCategory"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PublishResp_Info) Reset() { + *x = PublishResp_Info{} + mi := &file_pb_fiee_cast_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PublishResp_Info) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PublishResp_Info) ProtoMessage() {} + +func (x *PublishResp_Info) ProtoReflect() protoreflect.Message { + mi := &file_pb_fiee_cast_proto_msgTypes[44] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PublishResp_Info.ProtoReflect.Descriptor instead. +func (*PublishResp_Info) Descriptor() ([]byte, []int) { + return file_pb_fiee_cast_proto_rawDescGZIP(), []int{24, 0} +} + +func (x *PublishResp_Info) GetArtistUuid() string { + if x != nil { + return x.ArtistUuid + } + return "" +} + +func (x *PublishResp_Info) GetWorkCategory() int32 { + if x != nil { + return x.WorkCategory + } + return 0 +} + var File_pb_fiee_cast_proto protoreflect.FileDescriptor const file_pb_fiee_cast_proto_rawDesc = "" + @@ -3691,7 +3743,7 @@ const file_pb_fiee_cast_proto_rawDesc = "" + "\x10coverTimestampMs\x18\x12 \x01(\x04R\x10coverTimestampMs\x1aT\n" + "\x11MediaAccDataEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12)\n" + - "\x05value\x18\x02 \x01(\v2\x13.Cast.MediaUserInfoR\x05value:\x028\x01\"\xae\x02\n" + + "\x05value\x18\x02 \x01(\v2\x13.Cast.MediaUserInfoR\x05value:\x028\x01\"\xca\x02\n" + "\x0fUpdateStatusReq\x124\n" + "\n" + "workAction\x18\x01 \x01(\x0e2\x14.Cast.WorkActionENUMR\n" + @@ -3703,7 +3755,8 @@ const file_pb_fiee_cast_proto_rawDesc = "" + "\rconfirmRemark\x18\x04 \x01(\tR\rconfirmRemark\x12$\n" + "\rconfirmStatus\x18\x05 \x01(\rR\rconfirmStatus\x12$\n" + "\rapprovalReply\x18\x06 \x01(\tR\rapprovalReply\x127\n" + - "\vautoPublish\x18\a \x01(\x0e2\x15.Cast.AutoPublishENUMR\vautoPublish\"2\n" + + "\vautoPublish\x18\a \x01(\x0e2\x15.Cast.AutoPublishENUMR\vautoPublish\x12\x1a\n" + + "\bcostType\x18\b \x01(\rR\bcostType\"2\n" + "\x10MediaAccountsReq\x12\x1e\n" + "\n" + "artistUuid\x18\x01 \x01(\tR\n" + @@ -3743,11 +3796,13 @@ const file_pb_fiee_cast_proto_rawDesc = "" + "\x06images\x18\b \x03(\tR\x06images\x12\x1a\n" + "\bvideoUrl\x18\t \x01(\tR\bvideoUrl\x12\x1a\n" + "\bcoverUrl\x18\n" + - " \x01(\tR\bcoverUrl\"(\n" + + " \x01(\tR\bcoverUrl\"*\n" + "\n" + - "PublishReq\x12\x1a\n" + - "\bworkUuid\x18\x01 \x01(\tR\bworkUuid\"Q\n" + - "\vPublishResp\x12\x1e\n" + + "PublishReq\x12\x1c\n" + + "\tworkUuids\x18\x01 \x03(\tR\tworkUuids\"\x85\x01\n" + + "\vPublishResp\x12*\n" + + "\x04data\x18\x01 \x03(\v2\x16.Cast.PublishResp.InfoR\x04data\x1aJ\n" + + "\x04Info\x12\x1e\n" + "\n" + "artistUuid\x18\x01 \x01(\tR\n" + "artistUuid\x12\"\n" + @@ -3883,7 +3938,7 @@ func file_pb_fiee_cast_proto_rawDescGZIP() []byte { } var file_pb_fiee_cast_proto_enumTypes = make([]protoimpl.EnumInfo, 4) -var file_pb_fiee_cast_proto_msgTypes = make([]protoimpl.MessageInfo, 44) +var file_pb_fiee_cast_proto_msgTypes = make([]protoimpl.MessageInfo, 45) var file_pb_fiee_cast_proto_goTypes = []any{ (PlatformIDENUM)(0), // 0: Cast.PlatformIDENUM (AuthStatusENUM)(0), // 1: Cast.AuthStatusENUM @@ -3933,7 +3988,8 @@ var file_pb_fiee_cast_proto_goTypes = []any{ nil, // 45: Cast.WorkDetailResp.MediaAccDataEntry (*MediaAccountsResp_Info)(nil), // 46: Cast.MediaAccountsResp.Info (*MediaWorksResp_Info)(nil), // 47: Cast.MediaWorksResp.Info - (*emptypb.Empty)(nil), // 48: google.protobuf.Empty + (*PublishResp_Info)(nil), // 48: Cast.PublishResp.Info + (*emptypb.Empty)(nil), // 49: google.protobuf.Empty } var file_pb_fiee_cast_proto_depIdxs = []int32{ 0, // 0: Cast.MediaUserListReq.platformID:type_name -> Cast.PlatformIDENUM @@ -3961,54 +4017,55 @@ var file_pb_fiee_cast_proto_depIdxs = []int32{ 3, // 22: Cast.UpdateStatusReq.autoPublish:type_name -> Cast.AutoPublishENUM 46, // 23: Cast.MediaAccountsResp.data:type_name -> Cast.MediaAccountsResp.Info 47, // 24: Cast.MediaWorksResp.data:type_name -> Cast.MediaWorksResp.Info - 0, // 25: Cast.OAuthCodeToTokenReq.platformID:type_name -> Cast.PlatformIDENUM - 0, // 26: Cast.RefreshTokenReq.platformID:type_name -> Cast.PlatformIDENUM - 5, // 27: Cast.WorkDetailResp.MediaAccDataEntry.value:type_name -> Cast.MediaUserInfo - 4, // 28: Cast.Cast.MediaUserList:input_type -> Cast.MediaUserListReq - 7, // 29: Cast.Cast.UpdateMediaAccount:input_type -> Cast.UpdateMediaAccountReq - 9, // 30: Cast.Cast.UnbindManager:input_type -> Cast.UnbindManagerReq - 11, // 31: Cast.Cast.BindManager:input_type -> Cast.BindManagerReq - 12, // 32: Cast.Cast.UpdateWorkImage:input_type -> Cast.UpdateWorkImageReq - 15, // 33: Cast.Cast.UpdateWorkVideo:input_type -> Cast.UpdateWorkVideoReq - 17, // 34: Cast.Cast.WorkList:input_type -> Cast.WorkListReq - 19, // 35: Cast.Cast.WorkDetail:input_type -> Cast.WorkDetailReq - 22, // 36: Cast.Cast.UpdateStatus:input_type -> Cast.UpdateStatusReq - 23, // 37: Cast.Cast.MediaAccounts:input_type -> Cast.MediaAccountsReq - 25, // 38: Cast.Cast.MediaWorks:input_type -> Cast.MediaWorksReq - 27, // 39: Cast.Cast.Publish:input_type -> Cast.PublishReq - 29, // 40: Cast.Cast.RePublish:input_type -> Cast.RePublishReq - 31, // 41: Cast.Cast.DelWork:input_type -> Cast.DelWorkReq - 32, // 42: Cast.Cast.WorkInfo:input_type -> Cast.WorkInfoReq - 34, // 43: Cast.Cast.OAuthAccount:input_type -> Cast.OAuthAccountReq - 38, // 44: Cast.Cast.OAuthCodeToToken:input_type -> Cast.OAuthCodeToTokenReq - 40, // 45: Cast.Cast.RefreshToken:input_type -> Cast.RefreshTokenReq - 42, // 46: Cast.Cast.PublishMediaInfo:input_type -> Cast.PublishMediaInfoReq - 48, // 47: Cast.Cast.Test:input_type -> google.protobuf.Empty - 6, // 48: Cast.Cast.MediaUserList:output_type -> Cast.MediaUserListResp - 8, // 49: Cast.Cast.UpdateMediaAccount:output_type -> Cast.UpdateMediaAccountResp - 10, // 50: Cast.Cast.UnbindManager:output_type -> Cast.UnbindManagerResp - 48, // 51: Cast.Cast.BindManager:output_type -> google.protobuf.Empty - 13, // 52: Cast.Cast.UpdateWorkImage:output_type -> Cast.UpdateWorkImageResp - 16, // 53: Cast.Cast.UpdateWorkVideo:output_type -> Cast.UpdateWorkVideoResp - 18, // 54: Cast.Cast.WorkList:output_type -> Cast.WorkListResp - 21, // 55: Cast.Cast.WorkDetail:output_type -> Cast.WorkDetailResp - 48, // 56: Cast.Cast.UpdateStatus:output_type -> google.protobuf.Empty - 24, // 57: Cast.Cast.MediaAccounts:output_type -> Cast.MediaAccountsResp - 26, // 58: Cast.Cast.MediaWorks:output_type -> Cast.MediaWorksResp - 28, // 59: Cast.Cast.Publish:output_type -> Cast.PublishResp - 30, // 60: Cast.Cast.RePublish:output_type -> Cast.RePublishResp - 48, // 61: Cast.Cast.DelWork:output_type -> google.protobuf.Empty - 33, // 62: Cast.Cast.WorkInfo:output_type -> Cast.WorkInfoResp - 35, // 63: Cast.Cast.OAuthAccount:output_type -> Cast.OAuthAccountResp - 39, // 64: Cast.Cast.OAuthCodeToToken:output_type -> Cast.OAuthCodeToTokenResp - 41, // 65: Cast.Cast.RefreshToken:output_type -> Cast.RefreshTokenResp - 43, // 66: Cast.Cast.PublishMediaInfo:output_type -> Cast.PublishMediaInfoResp - 48, // 67: Cast.Cast.Test:output_type -> google.protobuf.Empty - 48, // [48:68] is the sub-list for method output_type - 28, // [28:48] is the sub-list for method input_type - 28, // [28:28] is the sub-list for extension type_name - 28, // [28:28] is the sub-list for extension extendee - 0, // [0:28] is the sub-list for field type_name + 48, // 25: Cast.PublishResp.data:type_name -> Cast.PublishResp.Info + 0, // 26: Cast.OAuthCodeToTokenReq.platformID:type_name -> Cast.PlatformIDENUM + 0, // 27: Cast.RefreshTokenReq.platformID:type_name -> Cast.PlatformIDENUM + 5, // 28: Cast.WorkDetailResp.MediaAccDataEntry.value:type_name -> Cast.MediaUserInfo + 4, // 29: Cast.Cast.MediaUserList:input_type -> Cast.MediaUserListReq + 7, // 30: Cast.Cast.UpdateMediaAccount:input_type -> Cast.UpdateMediaAccountReq + 9, // 31: Cast.Cast.UnbindManager:input_type -> Cast.UnbindManagerReq + 11, // 32: Cast.Cast.BindManager:input_type -> Cast.BindManagerReq + 12, // 33: Cast.Cast.UpdateWorkImage:input_type -> Cast.UpdateWorkImageReq + 15, // 34: Cast.Cast.UpdateWorkVideo:input_type -> Cast.UpdateWorkVideoReq + 17, // 35: Cast.Cast.WorkList:input_type -> Cast.WorkListReq + 19, // 36: Cast.Cast.WorkDetail:input_type -> Cast.WorkDetailReq + 22, // 37: Cast.Cast.UpdateStatus:input_type -> Cast.UpdateStatusReq + 23, // 38: Cast.Cast.MediaAccounts:input_type -> Cast.MediaAccountsReq + 25, // 39: Cast.Cast.MediaWorks:input_type -> Cast.MediaWorksReq + 27, // 40: Cast.Cast.Publish:input_type -> Cast.PublishReq + 29, // 41: Cast.Cast.RePublish:input_type -> Cast.RePublishReq + 31, // 42: Cast.Cast.DelWork:input_type -> Cast.DelWorkReq + 32, // 43: Cast.Cast.WorkInfo:input_type -> Cast.WorkInfoReq + 34, // 44: Cast.Cast.OAuthAccount:input_type -> Cast.OAuthAccountReq + 38, // 45: Cast.Cast.OAuthCodeToToken:input_type -> Cast.OAuthCodeToTokenReq + 40, // 46: Cast.Cast.RefreshToken:input_type -> Cast.RefreshTokenReq + 42, // 47: Cast.Cast.PublishMediaInfo:input_type -> Cast.PublishMediaInfoReq + 49, // 48: Cast.Cast.Test:input_type -> google.protobuf.Empty + 6, // 49: Cast.Cast.MediaUserList:output_type -> Cast.MediaUserListResp + 8, // 50: Cast.Cast.UpdateMediaAccount:output_type -> Cast.UpdateMediaAccountResp + 10, // 51: Cast.Cast.UnbindManager:output_type -> Cast.UnbindManagerResp + 49, // 52: Cast.Cast.BindManager:output_type -> google.protobuf.Empty + 13, // 53: Cast.Cast.UpdateWorkImage:output_type -> Cast.UpdateWorkImageResp + 16, // 54: Cast.Cast.UpdateWorkVideo:output_type -> Cast.UpdateWorkVideoResp + 18, // 55: Cast.Cast.WorkList:output_type -> Cast.WorkListResp + 21, // 56: Cast.Cast.WorkDetail:output_type -> Cast.WorkDetailResp + 49, // 57: Cast.Cast.UpdateStatus:output_type -> google.protobuf.Empty + 24, // 58: Cast.Cast.MediaAccounts:output_type -> Cast.MediaAccountsResp + 26, // 59: Cast.Cast.MediaWorks:output_type -> Cast.MediaWorksResp + 28, // 60: Cast.Cast.Publish:output_type -> Cast.PublishResp + 30, // 61: Cast.Cast.RePublish:output_type -> Cast.RePublishResp + 49, // 62: Cast.Cast.DelWork:output_type -> google.protobuf.Empty + 33, // 63: Cast.Cast.WorkInfo:output_type -> Cast.WorkInfoResp + 35, // 64: Cast.Cast.OAuthAccount:output_type -> Cast.OAuthAccountResp + 39, // 65: Cast.Cast.OAuthCodeToToken:output_type -> Cast.OAuthCodeToTokenResp + 41, // 66: Cast.Cast.RefreshToken:output_type -> Cast.RefreshTokenResp + 43, // 67: Cast.Cast.PublishMediaInfo:output_type -> Cast.PublishMediaInfoResp + 49, // 68: Cast.Cast.Test:output_type -> google.protobuf.Empty + 49, // [49:69] is the sub-list for method output_type + 29, // [29:49] is the sub-list for method input_type + 29, // [29:29] is the sub-list for extension type_name + 29, // [29:29] is the sub-list for extension extendee + 0, // [0:29] is the sub-list for field type_name } func init() { file_pb_fiee_cast_proto_init() } @@ -4022,7 +4079,7 @@ func file_pb_fiee_cast_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_pb_fiee_cast_proto_rawDesc), len(file_pb_fiee_cast_proto_rawDesc)), NumEnums: 4, - NumMessages: 44, + NumMessages: 45, NumExtensions: 0, NumServices: 1, }, diff --git a/api/cast/cast.pb.validate.go b/api/cast/cast.pb.validate.go index bd60999..3054503 100644 --- a/api/cast/cast.pb.validate.go +++ b/api/cast/cast.pb.validate.go @@ -2522,6 +2522,8 @@ func (m *UpdateStatusReq) validate(all bool) error { // no validation rules for AutoPublish + // no validation rules for CostType + if len(errors) > 0 { return UpdateStatusReqMultiError(errors) } @@ -3102,8 +3104,6 @@ func (m *PublishReq) validate(all bool) error { var errors []error - // no validation rules for WorkUuid - if len(errors) > 0 { return PublishReqMultiError(errors) } @@ -3203,9 +3203,39 @@ func (m *PublishResp) validate(all bool) error { var errors []error - // no validation rules for ArtistUuid + for idx, item := range m.GetData() { + _, _ = idx, item - // no validation rules for WorkCategory + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, PublishRespValidationError{ + field: fmt.Sprintf("Data[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, PublishRespValidationError{ + field: fmt.Sprintf("Data[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return PublishRespValidationError{ + field: fmt.Sprintf("Data[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } if len(errors) > 0 { return PublishRespMultiError(errors) @@ -5213,3 +5243,107 @@ var _ interface { Cause() error ErrorName() string } = MediaWorksResp_InfoValidationError{} + +// Validate checks the field values on PublishResp_Info with the rules defined +// in the proto definition for this message. If any rules are violated, the +// first error encountered is returned, or nil if there are no violations. +func (m *PublishResp_Info) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on PublishResp_Info with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// PublishResp_InfoMultiError, or nil if none found. +func (m *PublishResp_Info) ValidateAll() error { + return m.validate(true) +} + +func (m *PublishResp_Info) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for ArtistUuid + + // no validation rules for WorkCategory + + if len(errors) > 0 { + return PublishResp_InfoMultiError(errors) + } + + return nil +} + +// PublishResp_InfoMultiError is an error wrapping multiple validation errors +// returned by PublishResp_Info.ValidateAll() if the designated constraints +// aren't met. +type PublishResp_InfoMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m PublishResp_InfoMultiError) Error() string { + msgs := make([]string, 0, len(m)) + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m PublishResp_InfoMultiError) AllErrors() []error { return m } + +// PublishResp_InfoValidationError is the validation error returned by +// PublishResp_Info.Validate if the designated constraints aren't met. +type PublishResp_InfoValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e PublishResp_InfoValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e PublishResp_InfoValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e PublishResp_InfoValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e PublishResp_InfoValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e PublishResp_InfoValidationError) ErrorName() string { return "PublishResp_InfoValidationError" } + +// Error satisfies the builtin error interface +func (e PublishResp_InfoValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sPublishResp_Info.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = PublishResp_InfoValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = PublishResp_InfoValidationError{}