| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | //go:build !kvformat | 
					
						
							|  |  |  | // +build !kvformat | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package kv | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2022-09-28 18:30:40 +01:00
										 |  |  | 	"sync" | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	"codeberg.org/gruf/go-byteutil" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-28 18:30:40 +01:00
										 |  |  | // bufPool is a memory pool of byte buffers. | 
					
						
							|  |  |  | var bufPool = sync.Pool{ | 
					
						
							|  |  |  | 	New: func() interface{} { | 
					
						
							|  |  |  | 		return &byteutil.Buffer{B: make([]byte, 0, 512)} | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | // AppendFormat will append formatted format of Field to 'buf'. See .String() for details. | 
					
						
							|  |  |  | func (f Field) AppendFormat(buf *byteutil.Buffer, vbose bool) { | 
					
						
							|  |  |  | 	var fmtstr string | 
					
						
							|  |  |  | 	if vbose /* verbose */ { | 
					
						
							|  |  |  | 		fmtstr = `%#v` | 
					
						
							|  |  |  | 	} else /* regular */ { | 
					
						
							|  |  |  | 		fmtstr = `%+v` | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-09-28 18:30:40 +01:00
										 |  |  | 	AppendQuoteKey(buf, f.K) | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 	buf.WriteByte('=') | 
					
						
							| 
									
										
										
										
											2022-09-28 18:30:40 +01:00
										 |  |  | 	appendValuef(buf, fmtstr, f.V) | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Value returns the formatted value string of this Field. | 
					
						
							|  |  |  | func (f Field) Value(vbose bool) string { | 
					
						
							|  |  |  | 	var fmtstr string | 
					
						
							|  |  |  | 	if vbose /* verbose */ { | 
					
						
							|  |  |  | 		fmtstr = `%#v` | 
					
						
							|  |  |  | 	} else /* regular */ { | 
					
						
							|  |  |  | 		fmtstr = `%+v` | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	buf := byteutil.Buffer{B: make([]byte, 0, bufsize/2)} | 
					
						
							| 
									
										
										
										
											2022-09-28 18:30:40 +01:00
										 |  |  | 	appendValuef(&buf, fmtstr, f.V) | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 	return buf.String() | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2022-09-28 18:30:40 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | // appendValuef appends a quoted value string (formatted by fmt.Appendf) to 'buf'. | 
					
						
							|  |  |  | func appendValuef(buf *byteutil.Buffer, format string, args ...interface{}) { | 
					
						
							|  |  |  | 	// Write format string to a byte buffer | 
					
						
							|  |  |  | 	fmtbuf := bufPool.Get().(*byteutil.Buffer) | 
					
						
							|  |  |  | 	fmtbuf.B = fmt.Appendf(fmtbuf.B, format, args...) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Append quoted value to dst buffer | 
					
						
							|  |  |  | 	AppendQuoteValue(buf, fmtbuf.String()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Drop overly large capacity buffers | 
					
						
							|  |  |  | 	if fmtbuf.Cap() > int(^uint16(0)) { | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Replace buffer in pool | 
					
						
							|  |  |  | 	fmtbuf.Reset() | 
					
						
							|  |  |  | 	bufPool.Put(fmtbuf) | 
					
						
							|  |  |  | } |