Skip to content
This repository was archived by the owner on Sep 9, 2020. It is now read-only.

Commit cabd1a9

Browse files
committed
Map manifest and lock TOML to structs
This is a bit of a poor man's TOML mapping while we wait for go-toml to get reflection-based mapping implemented.
1 parent 7fc2e6a commit cabd1a9

File tree

3 files changed

+299
-105
lines changed

3 files changed

+299
-105
lines changed

lock.go

Lines changed: 35 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@
55
package dep
66

77
import (
8-
"bytes"
98
"encoding/hex"
10-
"fmt"
119
"io"
1210
"sort"
1311

@@ -24,48 +22,62 @@ type Lock struct {
2422
}
2523

2624
type rawLock struct {
27-
Memo string
28-
P []lockedDep
25+
Memo string
26+
Projects []rawLockedProject
2927
}
3028

31-
type lockedDep struct {
29+
type rawLockedProject struct {
3230
Name string
33-
Version string
3431
Branch string
3532
Revision string
33+
Version string
3634
Source string
3735
Packages []string
3836
}
3937

4038
func readLock(r io.Reader) (*Lock, error) {
41-
rl := rawLock{}
42-
err := json.NewDecoder(r).Decode(&rl)
39+
tree, err := toml.LoadReader(r)
4340
if err != nil {
44-
return nil, err
41+
return nil, errors.Wrap(err, "Unable to parse the lock as TOML")
4542
}
4643

47-
b, err := hex.DecodeString(rl.Memo)
48-
if err != nil {
49-
return nil, fmt.Errorf("invalid hash digest in lock's memo field")
44+
mapper := &tomlMapper{Tree: tree}
45+
46+
raw := rawLock{
47+
Memo: readKeyAsString(mapper, "memo"),
48+
Projects: readTableAsLockedProjects(mapper, "projects"),
49+
}
50+
51+
if mapper.Error != nil {
52+
return nil, errors.Wrap(mapper.Error, "Invalid lock structure")
5053
}
54+
return fromRawLock(raw)
55+
}
56+
57+
func fromRawLock(raw rawLock) (*Lock, error) {
58+
var err error
5159
l := &Lock{
52-
Memo: b,
53-
P: make([]gps.LockedProject, len(rl.P)),
60+
P: make([]gps.LockedProject, len(raw.Projects)),
61+
}
62+
63+
l.Memo, err = hex.DecodeString(raw.Memo)
64+
if err != nil {
65+
return nil, errors.Errorf("invalid hash digest in lock's memo field")
5466
}
5567

56-
for i, ld := range rl.P {
68+
for i, ld := range raw.Projects {
5769
r := gps.Revision(ld.Revision)
5870

5971
var v gps.Version = r
6072
if ld.Version != "" {
6173
if ld.Branch != "" {
62-
return nil, fmt.Errorf("lock file specified both a branch (%s) and version (%s) for %s", ld.Branch, ld.Version, ld.Name)
74+
return nil, errors.Errorf("lock file specified both a branch (%s) and version (%s) for %s", ld.Branch, ld.Version, ld.Name)
6375
}
6476
v = gps.NewVersion(ld.Version).Is(r)
6577
} else if ld.Branch != "" {
6678
v = gps.NewBranch(ld.Branch).Is(r)
6779
} else if r == "" {
68-
return nil, fmt.Errorf("lock file has entry for %s, but specifies no branch or version", ld.Name)
80+
return nil, errors.Errorf("lock file has entry for %s, but specifies no branch or version", ld.Name)
6981
}
7082

7183
id := gps.ProjectIdentifier{
@@ -74,7 +86,6 @@ func readLock(r io.Reader) (*Lock, error) {
7486
}
7587
l.P[i] = gps.NewLockedProject(id, v, ld.Packages)
7688
}
77-
7889
return l, nil
7990
}
8091

@@ -89,15 +100,15 @@ func (l *Lock) Projects() []gps.LockedProject {
89100
// toRaw converts the manifest into a representation suitable to write to the lock file
90101
func (l *Lock) toRaw() rawLock {
91102
raw := rawLock{
92-
Memo: hex.EncodeToString(l.Memo),
93-
P: make([]lockedDep, len(l.P)),
103+
Memo: hex.EncodeToString(l.Memo),
104+
Projects: make([]rawLockedProject, len(l.P)),
94105
}
95106

96107
sort.Sort(SortedLockedProjects(l.P))
97108

98109
for k, lp := range l.P {
99110
id := lp.Ident()
100-
ld := lockedDep{
111+
ld := rawLockedProject{
101112
Name: string(id.ProjectRoot),
102113
Source: id.Source,
103114
Packages: lp.Packages(),
@@ -106,7 +117,7 @@ func (l *Lock) toRaw() rawLock {
106117
v := lp.Version()
107118
ld.Revision, ld.Branch, ld.Version = getVersionInfo(v)
108119

109-
raw.P[k] = ld
120+
raw.Projects[k] = ld
110121
}
111122

112123
// TODO sort output - #15
@@ -117,12 +128,11 @@ func (l *Lock) toRaw() rawLock {
117128
func (l *Lock) MarshalTOML() (string, error) {
118129
raw := l.toRaw()
119130

120-
// TODO(carolynvs) Consider adding reflection-based marshal functionality to go-toml
121131
m := make(map[string]interface{})
122132
m["memo"] = raw.Memo
123-
p := make([]map[string]interface{}, len(raw.P))
133+
p := make([]map[string]interface{}, len(raw.Projects))
124134
for i := 0; i < len(p); i++ {
125-
srcPrj := raw.P[i]
135+
srcPrj := raw.Projects[i]
126136
prj := make(map[string]interface{})
127137
prj["name"] = srcPrj.Name
128138
prj["revision"] = srcPrj.Revision

0 commit comments

Comments
 (0)