/
parser.go
78 lines (58 loc) · 1.89 KB
/
parser.go
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
71
72
73
74
75
76
77
78
package recipes
import (
"encoding/json"
"fmt"
"io/ioutil"
"path"
"strings"
"github.com/godarch/darch/pkg/utils"
)
type recipeConfiguration struct {
Inherits string `json:"inherits"`
}
func parseRecipe(recipesDir string, recipeName string) (Recipe, error) {
recipe := Recipe{}
if len(recipesDir) == 0 {
return recipe, fmt.Errorf("A recipe directory must be provided")
}
if len(recipeName) == 0 {
return recipe, fmt.Errorf("A recipe name must be provided")
}
recipe.RecipesDir = utils.ExpandPath(recipesDir)
recipe.RecipeDir = path.Join(recipe.RecipesDir, recipeName)
recipe.Name = recipeName
if !utils.DirectoryExists(recipe.RecipeDir) {
return recipe, fmt.Errorf("Image directory %s doesn't exist", recipe.RecipeDir)
}
recipeConfiguration, err := loadRecipeConfiguration(recipe)
if err != nil {
return recipe, err
}
if strings.HasPrefix(recipeConfiguration.Inherits, "external:") {
recipe.InheritsExternal = true
recipe.Inherits = recipeConfiguration.Inherits[len("external:"):len(recipeConfiguration.Inherits)]
} else {
recipe.InheritsExternal = false
recipe.Inherits = recipeConfiguration.Inherits
}
return recipe, nil
}
func loadRecipeConfiguration(recipe Recipe) (recipeConfiguration, error) {
recipeConfigurationPath := path.Join(recipe.RecipeDir, "config.json")
recipeConfiguration := recipeConfiguration{}
if !utils.FileExists(recipeConfigurationPath) {
return recipeConfiguration, fmt.Errorf("No configuration file exists at %s", recipeConfigurationPath)
}
jsonData, err := ioutil.ReadFile(recipeConfigurationPath)
if err != nil {
return recipeConfiguration, err
}
err = json.Unmarshal(jsonData, &recipeConfiguration)
if err != nil {
return recipeConfiguration, err
}
if len(recipeConfiguration.Inherits) == 0 {
return recipeConfiguration, fmt.Errorf("No inherit property given for image %s", recipe.Name)
}
return recipeConfiguration, nil
}