79 lines
2.3 KiB
Go
79 lines
2.3 KiB
Go
package dataasset
|
|
|
|
import (
|
|
"unsafe"
|
|
|
|
"aego/data"
|
|
"aego/engine/module"
|
|
"aego/engine/problems"
|
|
"aego/schema"
|
|
)
|
|
|
|
const (
|
|
codeBroken = "DAT001"
|
|
codeType = "DAT004"
|
|
codeContent = "DAT005"
|
|
)
|
|
|
|
func broken(code, msg string) []problems.Diagnostic {
|
|
return []problems.Diagnostic{{Code: code, Severity: problems.Error, Message: msg, BlocksPlay: true}}
|
|
}
|
|
|
|
func report(out []problems.Diagnostic, c *module.AssetCheck, td *schema.TypeDescriptor, p unsafe.Pointer, issues []string, prefix string) []problems.Diagnostic {
|
|
for _, s := range issues {
|
|
out = append(out, problems.Diagnostic{Code: codeContent, Severity: problems.Warning, Message: s})
|
|
}
|
|
for _, is := range data.Validate(td, p, c.Exists) {
|
|
out = append(out, problems.Diagnostic{Code: is.Code, Severity: problems.Warning, Message: prefix + is.Message,
|
|
Subject: problems.Subject{Kind: problems.SubjectAsset, Asset: c.ID, File: c.Path, Field: prefix + is.Field}})
|
|
}
|
|
return append(out, module.ValidateData(td, p)...)
|
|
}
|
|
|
|
func knownType(c *module.AssetCheck, name string) ([]problems.Diagnostic, bool) {
|
|
if td, ok := c.Schema.ByName(name); ok && td.Kind == schema.TypeAsset {
|
|
return nil, true
|
|
}
|
|
if c.Partial {
|
|
return nil, false
|
|
}
|
|
return broken(codeType, "unknown data type "+name+"; the module that registers it is not loaded"), false
|
|
}
|
|
|
|
func checkRecord(c *module.AssetCheck) []problems.Diagnostic {
|
|
doc, err := data.ParseDoc(c.Source, c.Path)
|
|
if err != nil {
|
|
return broken(codeBroken, err.Error())
|
|
}
|
|
if ds, ok := knownType(c, doc.Type); !ok {
|
|
return ds
|
|
}
|
|
rec, err := data.NewLibrary(c.Schema, c.Data).Record(c.ID)
|
|
if err != nil {
|
|
return broken(codeBroken, err.Error())
|
|
}
|
|
return report(nil, c, rec.Type, rec.Ptr, rec.Issues, "")
|
|
}
|
|
|
|
func checkTable(c *module.AssetCheck) []problems.Diagnostic {
|
|
doc, err := data.ParseTable(c.Source, c.Path)
|
|
if err != nil {
|
|
return broken(codeBroken, err.Error())
|
|
}
|
|
if ds, ok := knownType(c, doc.Type); !ok {
|
|
return ds
|
|
}
|
|
t, err := data.NewLibrary(c.Schema, c.Data).Table(c.ID)
|
|
if err != nil {
|
|
return broken(codeBroken, err.Error())
|
|
}
|
|
var out []problems.Diagnostic
|
|
for _, s := range t.Issues {
|
|
out = append(out, problems.Diagnostic{Code: codeContent, Severity: problems.Warning, Message: s})
|
|
}
|
|
for i, p := range t.Rows {
|
|
out = report(out, c, t.Type, p, nil, t.IDs[i]+".")
|
|
}
|
|
return out
|
|
}
|