Conversation
hw09_struct_validator/validator.go
Outdated
|
|
||
| func (v ValidationErrors) Error() string { | ||
| panic("implement me") | ||
| var result string |
There was a problem hiding this comment.
Для сборки строк лучше использовать strings.Builder это более оптимальный по памяти способ. Пример:
var b strings.Builder
for i := 0; i < 10; i++ {
b.WriteString("foo")
}
return b.String()
По ссылке есть ещё пример использования, который подойдёт к вашей ситуации.
| go 1.16 | ||
|
|
||
| require ( | ||
| github.com/fatih/structs v1.1.0 |
There was a problem hiding this comment.
Обратите внимание, что данный репозиторий заархивирован и более не поддерживается. Таких зависимостей лучше избегать или быть готовыми их поддерживать своими силами.
hw09_struct_validator/validator.go
Outdated
| return nil | ||
| } | ||
|
|
||
| return errors.New(result.Error()) |
There was a problem hiding this comment.
Можно просто вернуть result так, как он у нас реализует интерфейс error. Это так же позволит нам избавится от проверки if len(result) == 0
There was a problem hiding this comment.
Если я возвращаю просто result, то не срабатывает мой метод Error
expected: *errors.errorString(&errors.errorString{s:"Validation error for field "Email": Value should match regexp "^\\w+@\\w+\\.\\w+$". Value "1gmail.com" is not match\n"})
actual : hw09structvalidator.ValidationErrors(hw09structvalidator.ValidationErrors{hw09structvalidator.ValidationError{Field:"Email", Err:(*errors.errorString)(0xc000298070)}})
There was a problem hiding this comment.
Да, всё верно. Вы сравниваете два разных типа, они никогда не будут одинаковыми. Вы можете либо сравнивать строковое представление ошибки используя assert.EqalError, либо вместо errors.New в тестах конструировать ValidationErrors
There was a problem hiding this comment.
Я в тестах сравниваю только тексты ошибок. Но проверку на длину и возврат nil я оставила, так как в противном случае вместо nil в result было hw09structvalidator.ValidationErrors(nil)
hw09_struct_validator/validator.go
Outdated
|
|
||
| type ValidationErrors []ValidationError | ||
|
|
||
| type ValidatorType int |
There was a problem hiding this comment.
Намного более удобно когда у нас объявлен типа ValidationErrors и сразу после этого идут методы этого типа, в нашем случае func (v ValidationErrors) Error() string.
hw09_struct_validator/validator.go
Outdated
|
|
||
| delimiterPos := strings.Index(str, ":") | ||
| if delimiterPos == -1 { | ||
| panic("Incorrect validator definition. Semicolon should be present") |
There was a problem hiding this comment.
Тут лучше вернуть ошибку: return errors.New("Incorrect validator definition. Semicolon should be present"). Старайтесь не использовать panic в коде, это затрудняет его поддержку. Замените все паники на ошибки.
hw09_struct_validator/validator.go
Outdated
|
|
||
| const VALIDATE_TAG_NAME = "validate" | ||
|
|
||
| var NilValidationError = ValidationError{"", nil} |
There was a problem hiding this comment.
Немного не точно. Это не nil ошибка, а пустая ошибка. Это немного разные вещи.
|
|
||
| type ValidatorType int | ||
|
|
||
| const ( |
There was a problem hiding this comment.
Это очень круто, что вы создали тип под возможные типы валидаторов и добавили для них константы. Только тут будет более удобно использовать не числовые константы а строки. Это позволит нам избавится от getValidatorTypeByString.
hw09_struct_validator/validator.go
Outdated
| } | ||
| } | ||
|
|
||
| func getValidatorValueByString(ruleString string) ValidatorValue { |
There was a problem hiding this comment.
Лучше будет просто привести тип в коде. Не принято создавать отдельный функций для этого.
|
|
||
| // Place your code here. | ||
| Validate(tt.in) | ||
| _ = tt |
| stT := reflect.TypeOf(v) | ||
| stV := reflect.ValueOf(v) | ||
|
|
||
| for i:=0; i<stT.NumField(); i++ { |
There was a problem hiding this comment.
Перед тем как вызвать NumField нужно убедится что v это структура иначе мы получим панику.
Домашнее задание №9 «Валидатор структур»
Чек-лист студента (Что это?)
go mod tidy..syncфайл. Зачем его удалять?Критерии оценки
Зачёт от 7 баллов