// Copyright (C) 2022 The OKit Authors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE // OR OTHER DEALINGS IN THE SOFTWARE. package format import ( "bufio" "strings" "time" "github.com/golang/protobuf/jsonpb" "go.pitz.tech/okit/pb" ) // Marshaler defines an abstraction for writing entries to stdout/stderr. This is predominantly used in report log, trace, // and event information from the process. type Marshaler interface { Marshal(writer *bufio.Writer, entry *pb.Entry) error } // JSON writes entries using JSON encoded protocol buffers. type JSON struct { Marshaler jsonpb.Marshaler } func (f JSON) Marshal(writer *bufio.Writer, entry *pb.Entry) error { f.Marshaler.Marshal(writer, entry) return writer.WriteByte('\n') } // Text writes entries using a custom text format. Entries are written using a TSV format and tags are url-encoded // key-value pairs. type Text struct{} func (f Text) Marshal(writer *bufio.Writer, entry *pb.Entry) error { writer.WriteString(entry.Timestamp.AsTime().Format(time.RFC3339)) writer.WriteByte('\t') writer.WriteString(strings.ToUpper(entry.Kind.String())) writer.WriteByte('\t') writer.WriteString(entry.Scope) writer.WriteByte('\t') for _, tag := range entry.Tags { qs := tag.AsQueryString() if qs == "" { continue } writer.WriteString(qs) writer.WriteByte('&') } return writer.WriteByte('\n') }