Heim  >  Artikel  >  Backend-Entwicklung  >  Wie man mit Cuelang eine Bedingung auf ein Strukturfeld eines von einem Golang-Modul generierten Hinweismusters setzt

Wie man mit Cuelang eine Bedingung auf ein Strukturfeld eines von einem Golang-Modul generierten Hinweismusters setzt

王林
王林nach vorne
2024-02-09 19:57:10935Durchsuche

Wie man mit Cuelang eine Bedingung auf ein Strukturfeld eines von einem Golang-Modul generierten Hinweismusters setzt

php-Editor Strawberry stellt Ihnen heute vor, wie Sie Cuelang verwenden, um Bedingungen in den Strukturfeldern des vom Golang-Modul generierten Eingabeaufforderungsmusters zu platzieren. cuelang ist eine leistungsstarke Sprache zum Definieren und Validieren von Datenstrukturen, die sich nahtlos in Golang integrieren lässt. Wenn wir von Golang generierte Module verwenden, stoßen wir häufig auf Situationen, in denen wir Bedingungen für Strukturfelder hinzufügen müssen. In diesem Artikel wird ausführlich erläutert, wie Sie Cuelang verwenden, um diese Anforderung zu erfüllen, und allen dabei helfen, die leistungsstarken Funktionen von Cuelang besser zu verstehen und anzuwenden. Als nächstes werden wir dieses Problem Schritt für Schritt analysieren und relevanten Beispielcode bereitstellen, damit jeder es besser verstehen kann. Lass uns einen Blick darauf werfen!

Frageninhalt

Ich möchte einige Strukturfelder im vom Golang-Modul generierten Eingabeaufforderungsmuster zusätzlich einschränken.

Das Folgende schema.cue wird aus dem entsprechenden Golang-Modul generiert

package app

#App: {
  version: string @go(Version)
}
...

Ich habe versucht, Hinweisanmerkungen im Golang-Quellmodul anzugeben (Beispiel unten), aber dies führte nicht zu den richtigen Einschränkungen im generierten schema.cue.

type App struct {
    Version         string    `cue:"'version: =~core.myapp.dev/v1'" yaml:"Version"`
}

Ein anderer Ansatz, den ich ausprobiert habe, bestand darin, Konjunktionen zu verwenden, um Instanzen des Schemas zu erweitern.

CB79515A7EDA1BA1F8290B9FA56F2A98

Aber, cue vet schema.cue测试/badVersionValue.yaml,并没有对stdout产生任何错误,其中badVersionValue.yaml包含Version:badstring.

Mit dem folgenden manuell geschriebenen Text konnte ich eine funktionierende Lösung finden schema.cue

package app

version: =~"core.myapp.dev/v1"

Das cue vet schema.cuetests/badVersionValue.yaml wird produzieren

Version: invalid value "badstring" (out of bound =~"core.myapp.dev/v1"):
...

Der Nachteil dieses Ansatzes besteht darin, dass ich die Hinweismusterdatei von Grund auf neu schreiben würde, anstatt eine Datei zu verwenden und zu iterieren, die aus dem Golang-Quellcode/der Quelle der Wahrheit generiert wurde.

Problemumgehung

Ich habe falsch verstanden, wie man Eingabeaufforderungen für Bewertungen richtig verwendet, wenn es um definitions ging.

Basierend auf diesem Beispiel von cuetorials.com können Sie angeben, wo -d “#Schema” sich befindet

Ich sehe nicht nur Folgendes erfolgreich, wo sich der Inhalt der Yaml-Datei befindet Version: 5.

cue vet badVersionStr.yaml schema.cue -d '#App'                         
Version: conflicting values 5 and string (mismatched types int and string):

Und fügen Sie auch Einschränkungen an vorhandene Felder gemäß OP hinzu:

package app

#App: {
  version: string @go(Version)
  version: =~ "core.myapp.dev/v1"
}
...

Erzeugt jetzt die erwartete Ausgabe

cue vet badVersionStr.yaml schema.cue -d '#App'                         
Version: invalid value "badString" (out of bound =~"core.myapp.dev/v1"):

Bearbeiten: Dies ist ein besserer Ansatz für Leute, die Golang-Module für alles verwenden. Sie können Einschränkungen als Strukturfeldanmerkungen in Golang-Modulen platzieren.

# app.go
type App struct {
   Version     string     `cue:"=~\"core.myapp.dev/v1\"" yaml:"Version"`
...

Verwenden Sie cue get go app.go 你会得到一个相应的 app_go_gen.cue, es sollte so aussehen

#App: {
    Version:     string & =~"core.myapp.dev/v1" @go(Version)
...

Dies funktioniert, wenn der oben genannte cue vet ...-Befehl ausgeführt wird. Das bedeutet, dass Sie im Golang-Modul nur Einschränkungen angeben und dann ein Cue-Schema generieren müssen, das diese Anmerkungen als Einschränkungen für die Strukturfelder interpretiert.

Das obige ist der detaillierte Inhalt vonWie man mit Cuelang eine Bedingung auf ein Strukturfeld eines von einem Golang-Modul generierten Hinweismusters setzt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen