|
|
package errors
|
|
|
|
|
|
import (
|
|
|
"fmt"
|
|
|
"strings"
|
|
|
)
|
|
|
|
|
|
// ValidationErrorDetail хранит данные об одной ошибке.
|
|
|
type ValidationErrorDetail struct {
|
|
|
Code ErrorCode // Код ошибки
|
|
|
Message string // Текст сообщения
|
|
|
Line int // Номер строки, где возникла ошибка
|
|
|
Column int // Позиция в строке
|
|
|
EndLine int // Конечная строка
|
|
|
EndColumn int // Конечный столбец
|
|
|
}
|
|
|
|
|
|
type UnknownKeyError struct {
|
|
|
Key string
|
|
|
Line int
|
|
|
Column int
|
|
|
EndLine int
|
|
|
EndColumn int
|
|
|
}
|
|
|
|
|
|
// ValidationError представляет совокупность ошибок валидации.
|
|
|
type ValidationError struct {
|
|
|
Errors []ValidationErrorDetail
|
|
|
}
|
|
|
|
|
|
// Error возвращает строковое представление всех ошибок.
|
|
|
func (ve *ValidationError) Error() string {
|
|
|
var sb strings.Builder
|
|
|
sb.WriteString("Найдены ошибки валидации:\n")
|
|
|
for i, errDetail := range ve.Errors {
|
|
|
sb.WriteString(fmt.Sprintf("%d) [%s] (Line %d, Col %d): %s\n", i+1, errDetail.Code, errDetail.Line, errDetail.Column, errDetail.Message))
|
|
|
}
|
|
|
return sb.String()
|
|
|
}
|
|
|
|
|
|
// AddDetail добавляет новую ошибку в список.
|
|
|
func (ve *ValidationError) AddDetail(code ErrorCode, message string, line, column int) {
|
|
|
ve.Errors = append(ve.Errors, ValidationErrorDetail{
|
|
|
Code: code,
|
|
|
Message: message,
|
|
|
Line: line,
|
|
|
Column: column,
|
|
|
})
|
|
|
}
|
|
|
|
|
|
func (ve *ValidationError) AddDetailWithSpan(code ErrorCode, message string, line, col, endLine, endCol int) {
|
|
|
ve.Errors = append(ve.Errors, ValidationErrorDetail{
|
|
|
Code: code,
|
|
|
Message: message,
|
|
|
Line: line,
|
|
|
Column: col,
|
|
|
EndLine: endLine,
|
|
|
EndColumn: endCol,
|
|
|
})
|
|
|
}
|
|
|
|
|
|
// IsEmpty проверяет, имеются ли ошибки.
|
|
|
func (ve *ValidationError) IsEmpty() bool {
|
|
|
return len(ve.Errors) == 0
|
|
|
}
|