package {{ .Props.MachineName }} import ( "github.com/grafana/grafana/pkg/kindsys" "github.com/grafana/thema" "github.com/grafana/thema/vmux" ) // rootrel is the relative path from the grafana repository root to the // directory containing the .cue files in which this kind is defined. Necessary // for runtime errors related to the definition and/or lineage to provide // a real path to the correct .cue file. const rootrel string = "kinds/{{ .Props.MachineName }}" // TODO standard generated docs type Kind struct { kindsys.Core lin thema.ConvergentLineage[*{{ .Props.Name }}] jcodec vmux.Codec valmux vmux.ValueMux[*{{ .Props.Name }}] } // type guard - ensure generated Kind type satisfies the kindsys.Core interface var _ kindsys.Core = &Kind{} // TODO standard generated docs func NewKind(rt *thema.Runtime, opts ...thema.BindOption) (*Kind, error) { def, err := kindsys.LoadCoreKindDef(rootrel, rt.Context(), nil) if err != nil { return nil, err } k := &Kind{} k.Core, err = kindsys.BindCore(rt, def, opts...) if err != nil { return nil, err } // Get the thema.Schema that the meta says is in the current version (which // codegen ensures is always the latest) cursch := thema.SchemaP(k.Core.Lineage(), def.Properties.CurrentVersion) tsch, err := thema.BindType[*{{ .Props.Name }}](cursch, &{{ .Props.Name }}{}) if err != nil { // Should be unreachable, modulo bugs in the Thema->Go code generator return nil, err } k.jcodec = vmux.NewJSONCodec("{{ .Props.MachineName }}.json") k.lin = tsch.ConvergentLineage() k.valmux = vmux.NewValueMux(k.lin.TypedSchema(), k.jcodec) return k, nil } // ConvergentLineage returns the same [thema.Lineage] as Lineage, but bound (see [thema.BindType]) // to the the {{ .Props.Name }} type generated from the current schema, v{{ .Props.CurrentVersion }}. func (k *Kind) ConvergentLineage() thema.ConvergentLineage[*{{ .Props.Name }}] { return k.lin } // JSONValueMux is a version multiplexer that maps a []byte containing JSON data // at any schematized dashboard version to an instance of {{ .Props.Name }}. // // Validation and translation errors emitted from this func will identify the // input bytes as "dashboard.json". // // This is a thin wrapper around Thema's [vmux.ValueMux]. func (k *Kind) JSONValueMux(b []byte) (*{{ .Props.Name }}, thema.TranslationLacunas, error) { return k.valmux(b) }