12
"code.gitea.io/gitea/modules/json"
13
"code.gitea.io/gitea/modules/log"
15
"github.com/santhosh-tekuri/jsonschema/v5"
20
func Load(filename string, data any, validation bool) error {
21
isJSON := strings.HasSuffix(filename, ".json")
23
bs, err := os.ReadFile(filename)
29
err := validate(bs, data, isJSON)
34
return unmarshal(bs, data, isJSON)
37
func unmarshal(bs []byte, data any, isJSON bool) error {
39
return json.Unmarshal(bs, data)
41
return yaml.Unmarshal(bs, data)
44
func getSchema(filename string) (*jsonschema.Schema, error) {
45
c := jsonschema.NewCompiler()
46
c.LoadURL = openSchema
47
return c.Compile(filename)
50
func validate(bs []byte, datatype any, isJSON bool) error {
52
err := unmarshal(bs, &v, isJSON)
57
v, err = toStringKeys(v)
63
var schemaFilename string
64
switch datatype := datatype.(type) {
66
schemaFilename = "issue.json"
68
schemaFilename = "milestone.json"
70
return fmt.Errorf("file_format:validate: %T has not a validation implemented", datatype)
73
sch, err := getSchema(schemaFilename)
79
log.Error("migration validation with %s failed:\n%#v", schemaFilename, err)
84
func toStringKeys(val any) (any, error) {
86
switch val := val.(type) {
88
m := make(map[string]any)
89
for k, v := range val {
90
m[k], err = toStringKeys(v)
97
l := make([]any, len(val))
98
for i, v := range val {
99
l[i], err = toStringKeys(v)
106
return val.Format(time.RFC3339), nil