summaryrefslogtreecommitdiff
path: root/engine/Components/Packages/Package.go
blob: 9f2fdd2ba7884790a8ea79e11feeaf5707f8151c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package packages

import (
	"encoding/json"
	"fmt"
	"os"

	world "github.com/DegustatorPonos/RuinesOfRafdolon/Components/World"
	settings "github.com/DegustatorPonos/RuinesOfRafdolon/Settings"
	rl "github.com/gen2brain/raylib-go/raylib"
)

type PackageDescription struct {
	Name string `json:"name"`
	Version uint64 `json:"version"`
	Type string `json:"type"`
	MinimumVersion *settings.AppVersion
	MaximumVersion *settings.AppVersion
}

type Package struct {
	Description PackageDescription `json:"description"`
	Worlds map[string]world.World  `json:"-"`
}

func (base *Package) String() string {
	var outp, jsonErr = json.Marshal(base)
	if jsonErr != nil {
		return fmt.Sprintf("Failed to parse settings: %s", jsonErr.Error())
	}
	return string(outp)
}

func ReadPackage(dir os.DirEntry) (*Package, error) {
	var dirPath = ConcantinateFileLocation(settings.Current.PackagesLocation, dir.Name())
	var desc = PackageDescription{}
	if descErr := ReadValidJSONfromFile(ConcantinateFileLocation(dirPath, "Description.json"), &desc); descErr != nil {
		return nil, descErr
	}
	return &Package{
		Description: desc,
	}, nil
}

func (base *PackageDescription) IsValid() error {
	if base.Name == "" {
		return fmt.Errorf("Invalid package descriptor: the name cannot be empty")
	}
	if base.Version == 0{
		return fmt.Errorf("Invalid package descriptor: the version cannot be 0")
	}
	return nil
}

func loadWorldsFromDir(dirLocation string) (map[string]world.World, error) {
	var files, err = os.ReadDir(dirLocation)
	if err != nil {
		return nil, err
	}
	var outp = make(map[string]world.World)
	for _, v := range files {
		var new = world.World{}
		var loadErr = ReadJSONfromFile(ConcantinateFileLocation(dirLocation, v.Name()), &new)
		if loadErr != nil {
			rl.TraceLog(rl.LogWarning, "Failed to load the world %s: %s", v.Name(), loadErr)
			continue
		}
	}
	return outp, nil
}