package okit import ( "bufio" "strconv" "strings" "time" "github.com/golang/protobuf/jsonpb" "go.pitz.tech/okit/pb" ) // Format defines an abstraction for writing entries to stdout/stderr. This is predominantly used in report log, trace, // and event information from the process. type Format interface { Marshal(writer *bufio.Writer, entry *pb.Entry) error } // JSONFormat writes entries using JSON encoded protocol buffers. type JSONFormat struct { Marshaler jsonpb.Marshaler } func (f JSONFormat) Marshal(writer *bufio.Writer, entry *pb.Entry) error { f.Marshaler.Marshal(writer, entry) return writer.WriteByte('\n') } // TextFormat writes entries using a custom text format. type TextFormat struct{} func (f TextFormat) Marshal(writer *bufio.Writer, entry *pb.Entry) error { sink.WriteString(entry.Timestamp.AsTime().Format(time.RFC3339)) sink.WriteByte('\t') sink.WriteString(strings.ToUpper(entry.Kind.String())) sink.WriteByte('\t') switch v := entry.GetValue().(type) { case *pb.Entry_String_: sink.WriteString(v.String_) case *pb.Entry_Double: sink.WriteString(strconv.FormatFloat(v.Double, 'f', 5, 64)) case *pb.Entry_Duration: sink.WriteString(v.Duration.AsDuration().String()) } sink.WriteByte('\t') sink.WriteString(entry.Scope) sink.WriteByte('\t') for _, tag := range entry.Tags { qs := tag.AsQueryString() if qs == "" { continue } sink.WriteString(qs) sink.WriteByte('&') } return sink.WriteByte('\n') }