/*
 *
 * Copyright 2021 gRPC authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

// Package pretty defines helper functions to pretty-print structs for logging.
package pretty import ( protov1 protov2 ) const jsonIndent = " " // ToJSON marshals the input into a json string. // // If marshal fails, it falls back to fmt.Sprintf("%+v"). func ( interface{}) string { switch ee := .(type) { case protov1.Message: := jsonpb.Marshaler{Indent: jsonIndent} , := .MarshalToString() if != nil { // This may fail for proto.Anys, e.g. for xDS v2, LDS, the v2 // messages are not imported, and this will fail because the message // is not found. return fmt.Sprintf("%+v", ) } return case protov2.Message: := protojson.MarshalOptions{ Multiline: true, Indent: jsonIndent, } , := .Marshal() if != nil { // This may fail for proto.Anys, e.g. for xDS v2, LDS, the v2 // messages are not imported, and this will fail because the message // is not found. return fmt.Sprintf("%+v", ) } return string() default: , := json.MarshalIndent(, "", jsonIndent) if != nil { return fmt.Sprintf("%+v", ) } return string() } } // FormatJSON formats the input json bytes with indentation. // // If Indent fails, it returns the unchanged input as string. func ( []byte) string { var bytes.Buffer := json.Indent(&, , "", jsonIndent) if != nil { return string() } return .String() }