| 
									
										
										
										
											2023-05-09 19:19:48 +02:00
										 |  |  | /* | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 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 ( | 
					
						
							|  |  |  | 	"bytes" | 
					
						
							|  |  |  | 	"encoding/json" | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"google.golang.org/protobuf/encoding/protojson" | 
					
						
							| 
									
										
										
										
											2024-04-11 11:46:18 +02:00
										 |  |  | 	"google.golang.org/protobuf/protoadapt" | 
					
						
							| 
									
										
										
										
											2023-05-09 19:19:48 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const jsonIndent = "  " | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // ToJSON marshals the input into a json string. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // If marshal fails, it falls back to fmt.Sprintf("%+v"). | 
					
						
							| 
									
										
										
										
											2023-09-18 13:47:28 +01:00
										 |  |  | func ToJSON(e any) string { | 
					
						
							| 
									
										
										
										
											2024-04-11 11:46:18 +02:00
										 |  |  | 	if ee, ok := e.(protoadapt.MessageV1); ok { | 
					
						
							|  |  |  | 		e = protoadapt.MessageV2Of(ee) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if ee, ok := e.(protoadapt.MessageV2); ok { | 
					
						
							| 
									
										
										
										
											2023-05-09 19:19:48 +02:00
										 |  |  | 		mm := protojson.MarshalOptions{ | 
					
						
							|  |  |  | 			Indent:    jsonIndent, | 
					
						
							| 
									
										
										
										
											2024-04-11 11:46:18 +02:00
										 |  |  | 			Multiline: true, | 
					
						
							| 
									
										
										
										
											2023-05-09 19:19:48 +02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		ret, err := mm.Marshal(ee) | 
					
						
							|  |  |  | 		if err != 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", ee) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return string(ret) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-04-11 11:46:18 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	ret, err := json.MarshalIndent(e, "", jsonIndent) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return fmt.Sprintf("%+v", e) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return string(ret) | 
					
						
							| 
									
										
										
										
											2023-05-09 19:19:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // FormatJSON formats the input json bytes with indentation. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // If Indent fails, it returns the unchanged input as string. | 
					
						
							|  |  |  | func FormatJSON(b []byte) string { | 
					
						
							|  |  |  | 	var out bytes.Buffer | 
					
						
							|  |  |  | 	err := json.Indent(&out, b, "", jsonIndent) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return string(b) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return out.String() | 
					
						
							|  |  |  | } |