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

mlange-42 / modo / 12865372188

20 Jan 2025 09:53AM CUT coverage: 60.673% (+4.0%) from 56.633%
12865372188

push

github

web-flow
Full file to file test (#74)

901 of 1485 relevant lines covered (60.67%)

22.3 hits per line

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

52.69
/document/render.go
1
package document
2

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

12
        "github.com/mlange-42/modo/assets"
13
)
14

15
func Render(docs *Docs, config *Config, form Formatter) error {
2✔
16
        t, err := loadTemplates(form, config.TemplateDirs...)
2✔
17
        if err != nil {
2✔
18
                return err
×
19
        }
×
20
        if !config.DryRun {
3✔
21
                proc := NewProcessor(docs, form, t, config)
1✔
22
                return renderWith(config, proc)
1✔
23
        }
1✔
24

25
        files := []string{}
1✔
26
        proc := NewProcessorWithWriter(docs, form, t, config, func(file, text string) error {
8✔
27
                files = append(files, file)
7✔
28
                return nil
7✔
29
        })
7✔
30
        err = renderWith(config, proc)
1✔
31
        if err != nil {
1✔
32
                return err
×
33
        }
×
34

35
        fmt.Println("Dry-run. Would write these files:")
1✔
36
        for _, f := range files {
8✔
37
                fmt.Println(f)
7✔
38
        }
7✔
39
        return nil
1✔
40
}
41

42
func renderWith(config *Config, proc *Processor) error {
6✔
43
        caseSensitiveSystem = !config.CaseInsensitive
6✔
44
        if err := proc.PrepareDocs(); err != nil {
6✔
45
                return err
×
46
        }
×
47
        if err := renderPackage(proc.ExportDocs.Decl, []string{config.OutputDir}, proc); err != nil {
6✔
48
                return err
×
49
        }
×
50
        if err := proc.Formatter.WriteAuxiliary(proc.ExportDocs.Decl, config.OutputDir, proc); err != nil {
6✔
51
                return err
×
52
        }
×
53
        return nil
6✔
54
}
55

56
func renderElement(data interface {
57
        Named
58
        Kinded
59
}, proc *Processor) (string, error) {
31✔
60
        b := strings.Builder{}
31✔
61
        err := proc.Template.ExecuteTemplate(&b, data.GetKind()+".md", data)
31✔
62
        if err != nil {
31✔
63
                return "", err
×
64
        }
×
65
        return proc.Formatter.ProcessMarkdown(data, b.String(), proc)
31✔
66
}
67

68
func renderPackage(p *Package, dir []string, proc *Processor) error {
8✔
69
        newDir := appendNew(dir, p.GetFileName())
8✔
70
        pkgPath := path.Join(newDir...)
8✔
71
        if err := proc.mkDirs(pkgPath); err != nil {
8✔
72
                return err
×
73
        }
×
74

75
        for _, pkg := range p.Packages {
10✔
76
                if err := renderPackage(pkg, newDir, proc); err != nil {
2✔
77
                        return err
×
78
                }
×
79
        }
80

81
        for _, mod := range p.Modules {
14✔
82
                if err := renderModule(mod, newDir, proc); err != nil {
6✔
83
                        return err
×
84
                }
×
85
        }
86

87
        if err := renderList(p.Structs, newDir, proc); err != nil {
8✔
88
                return err
×
89
        }
×
90
        if err := renderList(p.Traits, newDir, proc); err != nil {
8✔
91
                return err
×
92
        }
×
93
        if err := renderList(p.Functions, newDir, proc); err != nil {
8✔
94
                return err
×
95
        }
×
96

97
        text, err := renderElement(p, proc)
8✔
98
        if err != nil {
8✔
99
                return err
×
100
        }
×
101
        if err := linkAndWrite(text, newDir, len(newDir), "package", proc); err != nil {
8✔
102
                return err
×
103
        }
×
104

105
        return nil
8✔
106
}
107

108
func renderModule(mod *Module, dir []string, proc *Processor) error {
6✔
109
        newDir := appendNew(dir, mod.GetFileName())
6✔
110
        if err := proc.mkDirs(path.Join(newDir...)); err != nil {
6✔
111
                return err
×
112
        }
×
113

114
        if err := renderList(mod.Structs, newDir, proc); err != nil {
6✔
115
                return err
×
116
        }
×
117
        if err := renderList(mod.Traits, newDir, proc); err != nil {
6✔
118
                return err
×
119
        }
×
120
        if err := renderList(mod.Functions, newDir, proc); err != nil {
6✔
121
                return err
×
122
        }
×
123

124
        text, err := renderElement(mod, proc)
6✔
125
        if err != nil {
6✔
126
                return err
×
127
        }
×
128
        if err := linkAndWrite(text, newDir, len(newDir), "module", proc); err != nil {
6✔
129
                return err
×
130
        }
×
131

132
        return nil
6✔
133
}
134

135
func renderList[T interface {
136
        Named
137
        Kinded
138
}](list []T, dir []string, proc *Processor) error {
42✔
139
        for _, elem := range list {
57✔
140
                newDir := appendNew(dir, elem.GetFileName())
15✔
141
                text, err := renderElement(elem, proc)
15✔
142
                if err != nil {
15✔
143
                        return err
×
144
                }
×
145
                if err := linkAndWrite(text, newDir, len(dir), elem.GetKind(), proc); err != nil {
15✔
146
                        return err
×
147
                }
×
148
        }
149
        return nil
42✔
150
}
151

152
func loadTemplates(f Formatter, additional ...string) (*template.Template, error) {
8✔
153
        allTemplates, err := findTemplatesFS()
8✔
154
        if err != nil {
8✔
155
                return nil, err
×
156
        }
×
157
        templ, err := template.New("all").Funcs(template.FuncMap{
8✔
158
                "toLink": f.ToLinkPath,
8✔
159
        }).ParseFS(assets.Templates, allTemplates...)
8✔
160
        if err != nil {
8✔
161
                return nil, err
×
162
        }
×
163
        for _, dir := range additional {
8✔
164
                moreTemplates, err := findTemplates(dir)
×
165
                if err != nil {
×
166
                        return nil, err
×
167
                }
×
168
                templ, err = templ.ParseFiles(moreTemplates...)
×
169
                if err != nil {
×
170
                        return nil, err
×
171
                }
×
172
        }
173
        return templ, nil
8✔
174
}
175

176
func findTemplatesFS() ([]string, error) {
8✔
177
        allTemplates := []string{}
8✔
178
        err := fs.WalkDir(assets.Templates, ".",
8✔
179
                func(path string, info os.DirEntry, err error) error {
240✔
180
                        if err != nil {
232✔
181
                                return err
×
182
                        }
×
183
                        if !info.IsDir() {
424✔
184
                                allTemplates = append(allTemplates, path)
192✔
185
                        }
192✔
186
                        return nil
232✔
187
                })
188
        if err != nil {
8✔
189
                return nil, err
×
190
        }
×
191
        return allTemplates, nil
8✔
192
}
193

194
func findTemplates(dir string) ([]string, error) {
×
195
        allTemplates := []string{}
×
196
        err := filepath.WalkDir(dir,
×
197
                func(path string, info os.DirEntry, err error) error {
×
198
                        if err != nil {
×
199
                                return err
×
200
                        }
×
201
                        if !info.IsDir() {
×
202
                                allTemplates = append(allTemplates, path)
×
203
                        }
×
204
                        return nil
×
205
                })
206
        if err != nil {
×
207
                return nil, err
×
208
        }
×
209
        return allTemplates, nil
×
210
}
211

212
func linkAndWrite(text string, dir []string, modElems int, kind string, proc *Processor) error {
29✔
213
        text, err := proc.ReplacePlaceholders(text, dir[1:], modElems-1)
29✔
214
        if err != nil {
29✔
215
                return err
×
216
        }
×
217
        outFile, err := proc.Formatter.ToFilePath(path.Join(dir...), kind)
29✔
218
        if err != nil {
29✔
219
                return err
×
220
        }
×
221
        return proc.WriteFile(outFile, text)
29✔
222
}
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