Skip to content

CheckerContext

go
type CheckerContext struct {
    StructValue      reflect.Value
    FieldName        string
    FieldType        reflect.Type
    FieldValue       interface{}
    FieldLabel       string
    TemplateLanguage language.Tag
    Rule             *rule
}

各チェッカーが受け取る引数。govalid があなたの関数を呼び出す前に 埋めるので、通常の使用ではあなた自身が構築することはありません。

フィールド

フィールド説明
StructValue外側の構造体の reflect.Value。これを使って兄弟フィールドを名前で参照。
FieldNameGo フィールド名(ラベルではない)。
FieldTypeフィールドの reflect.Type
FieldValue実際の値。型アサーションを行う前提。nil ポインタ/インターフェースのフィールドでは nil の場合があります。
FieldLabel解決済みラベル文字列(ロケール対応)。
TemplateLanguage現在の Check 呼び出しのアクティブロケール。
Ruleパース済みルールへのポインタ。Rule.params はタグパラメータの []string

レシピ

タグパラメータを読む

go
if len(c.Rule.params) == 0 {
    return govalid.MakeCheckerParamError(c)
}
limit, err := strconv.Atoi(c.Rule.params[0])

兄弟フィールドを参照する

go
sv := c.StructValue
for i := 0; i < sv.Type().NumField(); i++ {
    if sv.Type().Field(i).Name == "Other" {
        v := sv.Field(i).Interface()
        // ...
    }
}

安全な型アサーション

go
v, ok := c.FieldValue.(string)
if !ok {
    return govalid.MakeValueTypeError(c)
}

ローカライズされたエラーを構築

go
return govalid.NewErrorContext(c)

NewErrorContextc.Rule.checker を読み取って正しいテンプレート を引き、c.TemplateLanguage を適用し、先頭に c.FieldLabel を付け ます。SetMessageTemplates で 1 度メッセージを登録するだけで済みます。

MIT ライセンスのもとで公開されています。