| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | package kv | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"strconv" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"codeberg.org/gruf/go-byteutil" | 
					
						
							|  |  |  | 	"codeberg.org/gruf/go-kv/format" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-28 18:30:40 +01:00
										 |  |  | // AppendQuoteKey will append and escape/quote a formatted key string. | 
					
						
							|  |  |  | func AppendQuoteKey(buf *byteutil.Buffer, str string) { | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 	switch { | 
					
						
							| 
									
										
										
										
											2022-09-28 18:30:40 +01:00
										 |  |  | 	case len(str) > format.SingleTermLine || !strconv.CanBackquote(str): | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 		// Append quoted and escaped string | 
					
						
							|  |  |  | 		buf.B = strconv.AppendQuote(buf.B, str) | 
					
						
							|  |  |  | 	case format.ContainsDoubleQuote(str): | 
					
						
							|  |  |  | 		// Double quote and escape string | 
					
						
							|  |  |  | 		buf.B = append(buf.B, '"') | 
					
						
							|  |  |  | 		buf.B = format.AppendEscape(buf.B, str) | 
					
						
							|  |  |  | 		buf.B = append(buf.B, '"') | 
					
						
							|  |  |  | 	case len(str) < 1 || format.ContainsSpaceOrTab(str): | 
					
						
							|  |  |  | 		// Double quote this string as-is | 
					
						
							|  |  |  | 		buf.WriteString(`"` + str + `"`) | 
					
						
							|  |  |  | 	default: | 
					
						
							|  |  |  | 		// Append string as-is | 
					
						
							|  |  |  | 		buf.WriteString(str) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-28 18:30:40 +01:00
										 |  |  | // AppendQuoteValue will append and escape/quote a formatted value string. | 
					
						
							|  |  |  | func AppendQuoteValue(buf *byteutil.Buffer, str string) { | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 	switch { | 
					
						
							| 
									
										
										
										
											2022-09-28 18:30:40 +01:00
										 |  |  | 	case len(str) > format.SingleTermLine || !strconv.CanBackquote(str): | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 		// Append quoted and escaped string | 
					
						
							|  |  |  | 		buf.B = strconv.AppendQuote(buf.B, str) | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	case !doubleQuoted(str): | 
					
						
							|  |  |  | 		if format.ContainsDoubleQuote(str) { | 
					
						
							|  |  |  | 			// Double quote and escape string | 
					
						
							|  |  |  | 			buf.B = append(buf.B, '"') | 
					
						
							|  |  |  | 			buf.B = format.AppendEscape(buf.B, str) | 
					
						
							|  |  |  | 			buf.B = append(buf.B, '"') | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 		} else if format.ContainsSpaceOrTab(str) { | 
					
						
							|  |  |  | 			// Double quote this string as-is | 
					
						
							|  |  |  | 			buf.WriteString(`"` + str + `"`) | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Append string as-is | 
					
						
							|  |  |  | 	buf.WriteString(str) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // doubleQuoted will return whether 'str' is double quoted. | 
					
						
							|  |  |  | func doubleQuoted(str string) bool { | 
					
						
							|  |  |  | 	if len(str) < 2 || | 
					
						
							|  |  |  | 		str[0] != '"' || str[len(str)-1] != '"' { | 
					
						
							|  |  |  | 		return false | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	var delim bool | 
					
						
							|  |  |  | 	for i := len(str) - 2; i >= 0; i-- { | 
					
						
							|  |  |  | 		switch str[i] { | 
					
						
							|  |  |  | 		case '\\': | 
					
						
							|  |  |  | 			delim = !delim | 
					
						
							|  |  |  | 		default: | 
					
						
							|  |  |  | 			return !delim | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return !delim | 
					
						
							|  |  |  | } |