// 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 okit import ( "bufio" "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 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') 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') }