package clean

import "strings"

// Error sanitizes an error message so that it can be safely logged or displayed.
func Error(err error) string {
	if err == nil {
		return "no error"
	} else if s := strings.TrimSpace(err.Error()); s == "" {
		return "unknown error"
	} else {
		// Limit error message length.
		if len(s) > LengthLimit {
			s = s[:LengthLimit]
		}

		// Remove non-printable and other potentially problematic characters.
		return strings.Map(func(r rune) rune {
			if r < 32 || r == 127 {
				return -1
			}

			switch r {
			case '`', '"':
				return '\''
			case '%', '\\', '$', '<', '>', '{', '}':
				return '?'
			default:
				return r
			}
		}, s)
	}
}
