package logproto import ( fmt "fmt" io "io" "time" ) // Stream contains a unique labels set as a string and a set of entries for it. // We are not using the proto generated version but this custom one so that we // can improve serialization see benchmark. type Stream struct { Labels string `protobuf:"bytes,1,opt,name=labels,proto3" json:"labels"` Entries []Entry `protobuf:"bytes,2,rep,name=entries,proto3,customtype=EntryAdapter" json:"entries"` } // Entry is a log entry with a timestamp. type Entry struct { Timestamp time.Time `protobuf:"bytes,1,opt,name=timestamp,proto3,stdtime" json:"ts"` Line string `protobuf:"bytes,2,opt,name=line,proto3" json:"line"` } func (m *Stream) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } func (m *Stream) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } func (m *Stream) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l if len(m.Entries) > 0 { for iNdEx := len(m.Entries) - 1; iNdEx >= 0; iNdEx-- { { size, err := m.Entries[iNdEx].MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } i -= size i = encodeVarintLogproto(dAtA, i, uint64(size)) } i-- dAtA[i] = 0x12 } } if len(m.Labels) > 0 { i -= len(m.Labels) copy(dAtA[i:], m.Labels) i = encodeVarintLogproto(dAtA, i, uint64(len(m.Labels))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } func (m *Entry) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } func (m *Entry) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } func (m *Entry) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l if len(m.Line) > 0 { i -= len(m.Line) copy(dAtA[i:], m.Line) i = encodeVarintLogproto(dAtA, i, uint64(len(m.Line))) i-- dAtA[i] = 0x12 } n7, err7 := StdTimeMarshalTo(m.Timestamp, dAtA[i-SizeOfStdTime(m.Timestamp):]) if err7 != nil { return 0, err7 } i -= n7 i = encodeVarintLogproto(dAtA, i, uint64(n7)) i-- dAtA[i] = 0xa return len(dAtA) - i, nil } func (m *Stream) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { preIndex := iNdEx var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowLogproto } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ wire |= uint64(b&0x7F) << shift if b < 0x80 { break } } fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { return fmt.Errorf("proto: StreamAdapter: wiretype end group for non-group") } if fieldNum <= 0 { return fmt.Errorf("proto: StreamAdapter: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Labels", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowLogproto } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } intStringLen := int(stringLen) if intStringLen < 0 { return ErrInvalidLengthLogproto } postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthLogproto } if postIndex > l { return io.ErrUnexpectedEOF } m.Labels = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Entries", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowLogproto } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ msglen |= int(b&0x7F) << shift if b < 0x80 { break } } if msglen < 0 { return ErrInvalidLengthLogproto } postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthLogproto } if postIndex > l { return io.ErrUnexpectedEOF } m.Entries = append(m.Entries, Entry{}) if err := m.Entries[len(m.Entries)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipLogproto(dAtA[iNdEx:]) if err != nil { return err } if skippy < 0 { return ErrInvalidLengthLogproto } if (iNdEx + skippy) < 0 { return ErrInvalidLengthLogproto } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } iNdEx += skippy } } if iNdEx > l { return io.ErrUnexpectedEOF } return nil } func (m *Entry) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { preIndex := iNdEx var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowLogproto } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ wire |= uint64(b&0x7F) << shift if b < 0x80 { break } } fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { return fmt.Errorf("proto: EntryAdapter: wiretype end group for non-group") } if fieldNum <= 0 { return fmt.Errorf("proto: EntryAdapter: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowLogproto } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ msglen |= int(b&0x7F) << shift if b < 0x80 { break } } if msglen < 0 { return ErrInvalidLengthLogproto } postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthLogproto } if postIndex > l { return io.ErrUnexpectedEOF } if err := StdTimeUnmarshal(&m.Timestamp, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Line", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowLogproto } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } intStringLen := int(stringLen) if intStringLen < 0 { return ErrInvalidLengthLogproto } postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthLogproto } if postIndex > l { return io.ErrUnexpectedEOF } m.Line = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipLogproto(dAtA[iNdEx:]) if err != nil { return err } if skippy < 0 { return ErrInvalidLengthLogproto } if (iNdEx + skippy) < 0 { return ErrInvalidLengthLogproto } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } iNdEx += skippy } } if iNdEx > l { return io.ErrUnexpectedEOF } return nil } func (m *Stream) Size() (n int) { if m == nil { return 0 } var l int _ = l l = len(m.Labels) if l > 0 { n += 1 + l + sovLogproto(uint64(l)) } if len(m.Entries) > 0 { for _, e := range m.Entries { l = e.Size() n += 1 + l + sovLogproto(uint64(l)) } } return n } func (m *Entry) Size() (n int) { if m == nil { return 0 } var l int _ = l l = SizeOfStdTime(m.Timestamp) n += 1 + l + sovLogproto(uint64(l)) l = len(m.Line) if l > 0 { n += 1 + l + sovLogproto(uint64(l)) } return n } func (m *Stream) Equal(that interface{}) bool { if that == nil { return m == nil } that1, ok := that.(*Stream) if !ok { that2, ok := that.(Stream) if ok { that1 = &that2 } else { return false } } if that1 == nil { return m == nil } else if m == nil { return false } if m.Labels != that1.Labels { return false } if len(m.Entries) != len(that1.Entries) { return false } for i := range m.Entries { if !m.Entries[i].Equal(that1.Entries[i]) { return false } } return true } func (m *Entry) Equal(that interface{}) bool { if that == nil { return m == nil } that1, ok := that.(*Entry) if !ok { that2, ok := that.(Entry) if ok { that1 = &that2 } else { return false } } if that1 == nil { return m == nil } else if m == nil { return false } if !m.Timestamp.Equal(that1.Timestamp) { return false } if m.Line != that1.Line { return false } return true }