size-report.go raw
1 package builder
2
3 import (
4 _ "embed"
5 "fmt"
6 "html/template"
7 "os"
8 )
9
10 //go:embed size-report.html
11 var sizeReportBase string
12
13 func writeSizeReport(sizes *programSize, filename, pkgName string) error {
14 tmpl, err := template.New("report").Parse(sizeReportBase)
15 if err != nil {
16 return err
17 }
18
19 f, err := os.Create(filename)
20 if err != nil {
21 return fmt.Errorf("could not open report file: %w", err)
22 }
23 defer f.Close()
24
25 // Prepare data for the report.
26 type sizeLine struct {
27 Name string
28 Size *packageSize
29 }
30 programData := []sizeLine{}
31 for _, name := range sizes.sortedPackageNames() {
32 pkgSize := sizes.Packages[name]
33 programData = append(programData, sizeLine{
34 Name: name,
35 Size: pkgSize,
36 })
37 }
38 sizeTotal := map[string]uint64{
39 "code": sizes.Code,
40 "rodata": sizes.ROData,
41 "data": sizes.Data,
42 "bss": sizes.BSS,
43 "flash": sizes.Flash(),
44 }
45
46 // Write the report.
47 err = tmpl.Execute(f, map[string]any{
48 "pkgName": pkgName,
49 "sizes": programData,
50 "sizeTotal": sizeTotal,
51 })
52 if err != nil {
53 return fmt.Errorf("could not create report file: %w", err)
54 }
55 return nil
56 }
57