Skip to content

Commit 799b50a

Browse files
committed
Using LibrariesList / refactored BinaryMarshal metods
1 parent d81ff80 commit 799b50a

File tree

3 files changed

+80
-70
lines changed

3 files changed

+80
-70
lines changed

internal/arduino/libraries/libraries.go

+41-43
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
package libraries
1717

1818
import (
19-
"bytes"
2019
"encoding/binary"
2120
"errors"
2221
"fmt"
@@ -93,18 +92,17 @@ func (library *Library) String() string {
9392
return library.Name + "@" + library.Version.String()
9493
}
9594

96-
func (library *Library) MarshalBinary() ([]byte, error) {
97-
buffer := bytes.NewBuffer(make([]byte, 0, 4096))
95+
func (library *Library) MarshalBinary(out io.Writer) error {
9896
writeString := func(in string) error {
9997
inBytes := []byte(in)
100-
if err := binary.Write(buffer, binary.NativeEndian, uint16(len(inBytes))); err != nil {
98+
if err := binary.Write(out, binary.NativeEndian, uint16(len(inBytes))); err != nil {
10199
return err
102100
}
103-
_, err := buffer.Write(inBytes)
101+
_, err := out.Write(inBytes)
104102
return err
105103
}
106104
writeStringArray := func(in []string) error {
107-
if err := binary.Write(buffer, binary.NativeEndian, uint16(len(in))); err != nil {
105+
if err := binary.Write(out, binary.NativeEndian, uint16(len(in))); err != nil {
108106
return err
109107
}
110108
for _, i := range in {
@@ -115,14 +113,14 @@ func (library *Library) MarshalBinary() ([]byte, error) {
115113
return nil
116114
}
117115
writeMap := func(in map[string]bool) error {
118-
if err := binary.Write(buffer, binary.NativeEndian, uint16(len(in))); err != nil {
116+
if err := binary.Write(out, binary.NativeEndian, uint16(len(in))); err != nil {
119117
return err
120118
}
121119
for k, v := range in {
122120
if err := writeString(k); err != nil {
123121
return err
124122
}
125-
if err := binary.Write(buffer, binary.NativeEndian, v); err != nil {
123+
if err := binary.Write(out, binary.NativeEndian, v); err != nil {
126124
return err
127125
}
128126
}
@@ -136,89 +134,89 @@ func (library *Library) MarshalBinary() ([]byte, error) {
136134
}
137135
}
138136
if err := writeString(library.Name); err != nil {
139-
return nil, err
137+
return err
140138
}
141139
if err := writeString(library.Author); err != nil {
142-
return nil, err
140+
return err
143141
}
144142
if err := writeString(library.Maintainer); err != nil {
145-
return nil, err
143+
return err
146144
}
147145
if err := writeString(library.Sentence); err != nil {
148-
return nil, err
146+
return err
149147
}
150148
if err := writeString(library.Paragraph); err != nil {
151-
return nil, err
149+
return err
152150
}
153151
if err := writeString(library.Website); err != nil {
154-
return nil, err
152+
return err
155153
}
156154
if err := writeString(library.Category); err != nil {
157-
return nil, err
155+
return err
158156
}
159157
if err := writeStringArray(library.Architectures); err != nil {
160-
return nil, err
158+
return err
161159
}
162160
if err := writeStringArray(library.Types); err != nil {
163-
return nil, err
161+
return err
164162
}
165163
if err := writePath(library.InstallDir); err != nil {
166-
return nil, err
164+
return err
167165
}
168166
if err := writeString(library.DirName); err != nil {
169-
return nil, err
167+
return err
170168
}
171169
if err := writePath(library.SourceDir); err != nil {
172-
return nil, err
170+
return err
173171
}
174172
if err := writePath(library.UtilityDir); err != nil {
175-
return nil, err
173+
return err
176174
}
177-
if err := binary.Write(buffer, binary.NativeEndian, int32(library.Location)); err != nil {
178-
return nil, err
175+
if err := binary.Write(out, binary.NativeEndian, int32(library.Location)); err != nil {
176+
return err
179177
}
180178
// library.ContainerPlatform *cores.PlatformRelease `json:""`
181-
if err := binary.Write(buffer, binary.NativeEndian, int32(library.Layout)); err != nil {
182-
return nil, err
179+
if err := binary.Write(out, binary.NativeEndian, int32(library.Layout)); err != nil {
180+
return err
183181
}
184-
if err := binary.Write(buffer, binary.NativeEndian, library.DotALinkage); err != nil {
185-
return nil, err
182+
if err := binary.Write(out, binary.NativeEndian, library.DotALinkage); err != nil {
183+
return err
186184
}
187-
if err := binary.Write(buffer, binary.NativeEndian, library.Precompiled); err != nil {
188-
return nil, err
185+
if err := binary.Write(out, binary.NativeEndian, library.Precompiled); err != nil {
186+
return err
189187
}
190-
if err := binary.Write(buffer, binary.NativeEndian, library.PrecompiledWithSources); err != nil {
191-
return nil, err
188+
if err := binary.Write(out, binary.NativeEndian, library.PrecompiledWithSources); err != nil {
189+
return err
192190
}
193191
if err := writeString(library.LDflags); err != nil {
194-
return nil, err
192+
return err
195193
}
196-
if err := binary.Write(buffer, binary.NativeEndian, library.IsLegacy); err != nil {
197-
return nil, err
194+
if err := binary.Write(out, binary.NativeEndian, library.IsLegacy); err != nil {
195+
return err
198196
}
199-
if err := binary.Write(buffer, binary.NativeEndian, library.InDevelopment); err != nil {
200-
return nil, err
197+
if err := binary.Write(out, binary.NativeEndian, library.InDevelopment); err != nil {
198+
return err
201199
}
202200
if err := writeString(library.Version.String()); err != nil {
203-
return nil, err
201+
return err
204202
}
205203
if err := writeString(library.License); err != nil {
206-
return nil, err
204+
return err
207205
}
208206
//writeStringArray(library.Properties.AsSlice())
209207
if err := writeStringArray(library.Examples.AsStrings()); err != nil {
210-
return nil, err
208+
return err
211209
}
212210
if err := writeStringArray(library.declaredHeaders); err != nil {
213-
return nil, err
211+
return err
214212
}
215213
if err := writeStringArray(library.sourceHeaders); err != nil {
216-
return nil, err
214+
return err
217215
}
218216
if err := writeMap(library.CompatibleWith); err != nil {
219-
return nil, err
217+
return err
220218
}
221-
return buffer.Bytes(), nil
219+
return nil
222220
}
223221

224222
func (library *Library) UnmarshalBinary(in io.Reader) error {

internal/arduino/libraries/librarieslist.go

+32
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
package libraries
1717

1818
import (
19+
"encoding/binary"
20+
"fmt"
21+
"io"
1922
"sort"
2023

2124
semver "go.bug.st/relaxed-semver"
@@ -41,6 +44,35 @@ func (list *List) Add(libs ...*Library) {
4144
}
4245
}
4346

47+
func (list *List) UnmarshalBinary(in io.Reader) error {
48+
var n int32
49+
if err := binary.Read(in, binary.NativeEndian, &n); err != nil {
50+
return err
51+
}
52+
res := make([]*Library, n)
53+
for i := range res {
54+
var lib Library
55+
if err := lib.UnmarshalBinary(in); err != nil {
56+
return err
57+
}
58+
res[i] = &lib
59+
}
60+
*list = res
61+
return nil
62+
}
63+
64+
func (list *List) MarshalBinary(out io.Writer) error {
65+
if err := binary.Write(out, binary.NativeEndian, int32(len(*list))); err != nil {
66+
return err
67+
}
68+
for _, lib := range *list {
69+
if err := lib.MarshalBinary(out); err != nil {
70+
return fmt.Errorf("could not encode lib data of %s: %w", lib.InstallDir.String(), err)
71+
}
72+
}
73+
return nil
74+
}
75+
4476
// Remove removes the given library from the list
4577
func (list *List) Remove(libraryToRemove *Library) {
4678
for i, lib := range *list {

internal/arduino/libraries/librariesmanager/librariesmanager.go

+7-27
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
package librariesmanager
1717

1818
import (
19-
"encoding/binary"
2019
"errors"
2120
"fmt"
2221
"os"
@@ -202,7 +201,7 @@ func (lm *LibrariesManager) loadLibrariesFromDir(librariesDir *LibrariesDir) []*
202201

203202
librariesDir.scanned = true
204203

205-
var loadedLibs []*libraries.Library
204+
var loadedLibs libraries.List
206205
if cacheFilePath := librariesDir.Path.Join("libraries-loader-cache"); cacheFilePath.Exist() {
207206
logrus.WithField("file", cacheFilePath).Info("Using library cache")
208207

@@ -213,20 +212,11 @@ func (lm *LibrariesManager) loadLibrariesFromDir(librariesDir *LibrariesDir) []*
213212
return append(statuses, s)
214213
}
215214
defer cache.Close()
216-
var n int32
217-
if err := binary.Read(cache, binary.NativeEndian, &n); err != nil {
215+
216+
if err := loadedLibs.UnmarshalBinary(cache); err != nil {
218217
s := status.Newf(codes.FailedPrecondition, "reading lib cache %[1]s: %[2]s", cacheFilePath, err)
219218
return append(statuses, s)
220219
}
221-
loadedLibs = make([]*libraries.Library, n)
222-
for i := range loadedLibs {
223-
var lib libraries.Library
224-
if err := lib.UnmarshalBinary(cache); err != nil {
225-
s := status.Newf(codes.FailedPrecondition, "reading lib cache %[1]s: %[2]s", cacheFilePath, err)
226-
return append(statuses, s)
227-
}
228-
loadedLibs[i] = &lib
229-
}
230220
} else {
231221
var libDirs paths.PathList
232222
if librariesDir.IsSingleLibrary {
@@ -258,26 +248,16 @@ func (lm *LibrariesManager) loadLibrariesFromDir(librariesDir *LibrariesDir) []*
258248
// Write lib cache
259249
cache, err := cacheFilePath.Create()
260250
if err != nil {
261-
s := status.Newf(codes.FailedPrecondition, "writing lib cache %[1]s: %[2]s", cacheFilePath, err)
251+
s := status.Newf(codes.FailedPrecondition, "creating lib cache %[1]s: %[2]s", cacheFilePath, err)
262252
return append(statuses, s)
263253
}
264-
defer cache.Close()
265-
if err := binary.Write(cache, binary.NativeEndian, int32(len(loadedLibs))); err != nil {
254+
err = loadedLibs.MarshalBinary(cache)
255+
cache.Close()
256+
if err != nil {
266257
cacheFilePath.Remove()
267258
s := status.Newf(codes.FailedPrecondition, "writing lib cache %[1]s: %[2]s", cacheFilePath, err)
268259
return append(statuses, s)
269260
}
270-
for _, lib := range loadedLibs {
271-
data, err := lib.MarshalBinary()
272-
if err != nil {
273-
panic("could not encode lib data for: " + lib.InstallDir.String())
274-
}
275-
if _, err := cache.Write(data); err != nil {
276-
cacheFilePath.Remove()
277-
s := status.Newf(codes.FailedPrecondition, "writing lib cache %[1]s: %[2]s", cacheFilePath, err)
278-
return append(statuses, s)
279-
}
280-
}
281261
}
282262

283263
for _, library := range loadedLibs {

0 commit comments

Comments
 (0)