Перейти валидатор с sql нулевых типов? - PullRequest
0 голосов
/ 29 октября 2018

У меня проблемы с настройкой валидатора golang для работы с нулевыми типами SQL. Вот пример того, что я пробовал:

package main

import (
    "database/sql"
    "database/sql/driver"
    "log"

    "gopkg.in/go-playground/validator.v9"
)

// NullInt64
type NullInt64 struct {
    sql.NullInt64
    Set bool
}

func MakeNullInt64(valid bool, val int64) NullInt64 {
    n := NullInt64{}
    n.Set = true
    n.Valid = valid
    if valid {
        n.Int64 = val
    }
    return n
}
func (n *NullInt64) Value() (driver.Value, error) {
    if !n.NullInt64.Valid {
        return nil, nil
    }
    return n.NullInt64.Int64, nil
}

type Thing struct {
    N2 NullInt64 `validate:"min=10"`
    N3 int64     `validate:"min=10"`
    N4 *int64    `validate:"min=10"`
}

func main() {
    validate := validator.New()

    n := int64(6)
    number := MakeNullInt64(true, n)
    thing := Thing{number, n, &n}
    e := validate.Struct(thing)

    log.Println(e)
}

Когда я запускаю этот код, я получаю только такой вывод:

Ключ: ошибка «Thing.N3»: проверка поля для «N3» не выполнена на «min» тег

Ключ: ошибка «Thing.N4»: проверка поля для «N4» не выполнена на тег 'min'

Проблема в том, что я хочу, чтобы он также показал, что Thing.N2 не удалось по тем же причинам, что и Thing.N3 и Thing.N4.

Я попытался ввести метод func (n *NullInt64) Value(), потому что он упоминался в документации . Но я думаю, что что-то неправильно понял. Может кто-нибудь сказать мне, что я сделал не так?

1 Ответ

0 голосов
/ 09 февраля 2019

UPDATE

Мой коллега сказал мне, что есть Пример специально для этого. Вы можете проверить это. Мое другое предлагаемое решение должно все еще работать.


Поскольку значение, которое вы пытаетесь проверить, равно Int64 внутри sql.NullInt64, самый простой способ - удалить тег validate и просто зарегистрировать проверку Уровень структуры , используя:

validate.RegisterStructValidation(NullInt64StructLevelValidation, NullInt64{})

, а NullInt64StructLevelValidation - это StructLevelFunc, который выглядит следующим образом:

func NullInt64StructLevelValidation(sl validator.StructLevel) {
    ni := sl.Current().Interface().(NullInt64)
    if ni.NullInt64.Int64 < 10 {
        sl.ReportError(ni.NullInt64.Int64, "Int64", "", "min", "")
    }
}

Примечание # 1: в этой строке thing := Thing{number,&number,n,&n} слишком много аргументов. Я полагаю, вы имели в виду thing := Thing{number, n, &n}

Примечание # 2: Инструменты Go, включая gofmt , считаются одной из самых мощных функций языка. Пожалуйста, рассмотрите возможность использования его / их .

РЕДАКТИРОВАТЬ # 1: Я не думаю, что реализация интерфейса Valuer имеет какое-либо значение в этом контексте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...