• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

mlange-42 / modo / 12735598201

12 Jan 2025 05:21PM CUT coverage: 26.287% (-1.3%) from 27.616%
12735598201

push

github

web-flow
Use templates to generate paths (#22)

3 of 46 new or added lines in 2 files covered. (6.52%)

97 of 369 relevant lines covered (26.29%)

1.37 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

21.85
/template.go
1
package modo
2

3
import (
4
        "embed"
5
        "io/fs"
6
        "log"
7
        "os"
8
        "path"
9
        "strings"
10
        "text/template"
11

12
        "github.com/mlange-42/modo/document"
13
        "github.com/mlange-42/modo/format"
14
)
15

16
//go:embed templates/* templates/**/*
17
var templates embed.FS
18
var t *template.Template
19

20
var functions = template.FuncMap{
21
        "pathJoin": path.Join,
22
}
23

24
func init() {
1✔
25
        var err error
1✔
26
        t, err = loadTemplates()
1✔
27
        if err != nil {
1✔
28
                log.Fatal(err)
×
29
        }
×
30
}
31

32
func Render(data document.Kinded) (string, error) {
2✔
33
        b := strings.Builder{}
2✔
34
        err := t.ExecuteTemplate(&b, data.GetKind()+".md", data)
2✔
35
        if err != nil {
2✔
36
                return "", err
×
37
        }
×
38
        return b.String(), nil
2✔
39
}
40

41
func RenderPackage(p *document.Package, dir string, rFormat format.Format, root bool) error {
×
42
        pkgPath := path.Join(dir, p.GetFileName())
×
43
        if err := mkDirs(pkgPath); err != nil {
×
44
                return err
×
45
        }
×
46
        p.SetPath(pkgPath)
×
NEW
47

×
NEW
48
        pkgFile := strings.Builder{}
×
NEW
49
        if err := t.ExecuteTemplate(&pkgFile, "package_path.md", pkgPath); err != nil {
×
NEW
50
                return err
×
NEW
51
        }
×
52

53
        for _, pkg := range p.Packages {
×
54
                if err := RenderPackage(pkg, pkgPath, rFormat, false); err != nil {
×
55
                        return err
×
56
                }
×
57
        }
58

59
        for _, mod := range p.Modules {
×
60
                modPath := path.Join(pkgPath, mod.GetFileName())
×
61
                if err := renderModule(mod, modPath); err != nil {
×
62
                        return err
×
63
                }
×
64
        }
65

66
        text, err := Render(p)
×
67
        if err != nil {
×
68
                return err
×
69
        }
×
NEW
70
        if err := os.WriteFile(pkgFile.String(), []byte(text), 0666); err != nil {
×
71
                return err
×
72
        }
×
73

74
        if root {
×
75
                if err := format.GetFormatter(rFormat).WriteAuxiliary(p, dir, t); err != nil {
×
76
                        return err
×
77
                }
×
78
        }
79

80
        return nil
×
81
}
82

83
func renderModule(mod *document.Module, dir string) error {
×
84
        if err := mkDirs(dir); err != nil {
×
85
                return err
×
86
        }
×
87
        mod.SetPath(dir)
×
NEW
88

×
NEW
89
        modFile := strings.Builder{}
×
NEW
90
        if err := t.ExecuteTemplate(&modFile, "module_path.md", dir); err != nil {
×
NEW
91
                return err
×
NEW
92
        }
×
93

94
        if err := renderList(mod.Structs, dir); err != nil {
×
95
                return err
×
96
        }
×
97
        if err := renderList(mod.Traits, dir); err != nil {
×
98
                return err
×
99
        }
×
100
        if err := renderList(mod.Functions, dir); err != nil {
×
101
                return err
×
102
        }
×
103

104
        text, err := Render(mod)
×
105
        if err != nil {
×
106
                return err
×
107
        }
×
NEW
108
        if err := os.WriteFile(modFile.String(), []byte(text), 0666); err != nil {
×
109
                return err
×
110
        }
×
111

112
        return nil
×
113
}
114

115
func renderList[T interface {
116
        document.Named
117
        document.Kinded
118
        document.Pathed
119
}](list []T, dir string) error {
×
120
        for _, elem := range list {
×
121
                text, err := Render(elem)
×
122
                if err != nil {
×
123
                        return err
×
124
                }
×
NEW
125
                memberPath := path.Join(dir, elem.GetFileName())
×
NEW
126

×
NEW
127
                memberFile := strings.Builder{}
×
NEW
128
                if err := t.ExecuteTemplate(&memberFile, "member_path.md", memberPath); err != nil {
×
NEW
129
                        return err
×
NEW
130
                }
×
131

NEW
132
                elem.SetPath(memberPath)
×
NEW
133
                if err := os.WriteFile(memberFile.String(), []byte(text), 0666); err != nil {
×
134
                        return err
×
135
                }
×
136
        }
137
        return nil
×
138
}
139

140
func loadTemplates() (*template.Template, error) {
1✔
141
        allTemplates, err := findTemplates()
1✔
142
        if err != nil {
1✔
143
                return nil, err
×
144
        }
×
145
        templ, err := template.New("all").Funcs(functions).ParseFS(templates, allTemplates...)
1✔
146
        if err != nil {
1✔
NEW
147
                return nil, err
×
NEW
148
        }
×
149
        return templ, nil
1✔
150
}
151

152
func findTemplates() ([]string, error) {
1✔
153
        allTemplates := []string{}
1✔
154
        err := fs.WalkDir(templates, ".",
1✔
155
                func(path string, info os.DirEntry, err error) error {
32✔
156
                        if err != nil {
31✔
157
                                return err
×
158
                        }
×
159
                        if !info.IsDir() {
57✔
160
                                allTemplates = append(allTemplates, path)
26✔
161
                        }
26✔
162
                        return nil
31✔
163
                })
164
        if err != nil {
1✔
165
                return nil, err
×
166
        }
×
167
        return allTemplates, nil
1✔
168
}
169

170
func mkDirs(path string) error {
×
171
        if err := os.MkdirAll(path, os.ModePerm); err != nil && !os.IsExist(err) {
×
172
                return err
×
173
        }
×
174
        return nil
×
175
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc