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

mlange-42 / modo / 12844481215

18 Jan 2025 01:34PM CUT coverage: 59.033% (+0.7%) from 58.333%
12844481215

push

github

web-flow
Fix broken links when referencing parents or the root package (#62)

14 of 19 new or added lines in 2 files covered. (73.68%)

7 existing lines in 1 file now uncovered.

794 of 1345 relevant lines covered (59.03%)

7.46 hits per line

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

45.51
/document/render.go
1
package document
2

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

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

14
type Config struct {
15
        OutputDir     string
16
        TemplateDirs  []string
17
        UseExports    bool
18
        ShortLinks    bool
19
        CaseSensitive bool
20
}
21

22
func Render(docs *Docs, config *Config, form Formatter) error {
×
23
        t, err := loadTemplates(form, config.TemplateDirs...)
×
24
        if err != nil {
×
25
                return err
×
26
        }
×
27
        proc := NewProcessor(docs, form, t, config.UseExports, config.ShortLinks)
×
28
        return renderWith(config, proc)
×
29
}
30

31
func renderWith(config *Config, proc *Processor) error {
4✔
32
        caseSensitiveSystem = config.CaseSensitive
4✔
33
        if err := proc.PrepareDocs(); err != nil {
4✔
34
                return err
×
35
        }
×
36
        if err := renderPackage(proc.ExportDocs.Decl, []string{config.OutputDir}, proc); err != nil {
4✔
37
                return err
×
38
        }
×
39
        if err := proc.Formatter.WriteAuxiliary(proc.ExportDocs.Decl, config.OutputDir, proc); err != nil {
4✔
40
                return err
×
41
        }
×
42
        return nil
4✔
43
}
44

45
func renderElement(data interface {
46
        Named
47
        Kinded
48
}, proc *Processor) (string, error) {
17✔
49
        b := strings.Builder{}
17✔
50
        err := proc.Template.ExecuteTemplate(&b, data.GetKind()+".md", data)
17✔
51
        if err != nil {
17✔
52
                return "", err
×
53
        }
×
54
        return proc.Formatter.ProcessMarkdown(data, b.String(), proc)
17✔
55
}
56

57
func renderPackage(p *Package, dir []string, proc *Processor) error {
4✔
58
        newDir := appendNew(dir, p.GetFileName())
4✔
59
        pkgPath := path.Join(newDir...)
4✔
60
        if err := mkDirs(pkgPath); err != nil {
4✔
61
                return err
×
62
        }
×
63

64
        for _, pkg := range p.Packages {
4✔
65
                if err := renderPackage(pkg, newDir, proc); err != nil {
×
66
                        return err
×
67
                }
×
68
        }
69

70
        for _, mod := range p.Modules {
8✔
71
                if err := renderModule(mod, newDir, proc); err != nil {
4✔
72
                        return err
×
73
                }
×
74
        }
75

76
        if err := renderList(p.Structs, newDir, proc); err != nil {
4✔
77
                return err
×
78
        }
×
79
        if err := renderList(p.Traits, newDir, proc); err != nil {
4✔
80
                return err
×
81
        }
×
82
        if err := renderList(p.Functions, newDir, proc); err != nil {
4✔
83
                return err
×
84
        }
×
85

86
        text, err := renderElement(p, proc)
4✔
87
        if err != nil {
4✔
88
                return err
×
89
        }
×
90
        if err := linkAndWrite(text, newDir, len(newDir), "package", proc); err != nil {
4✔
91
                return err
×
92
        }
×
93

94
        return nil
4✔
95
}
96

97
func renderModule(mod *Module, dir []string, proc *Processor) error {
4✔
98
        newDir := appendNew(dir, mod.GetFileName())
4✔
99
        if err := mkDirs(path.Join(newDir...)); err != nil {
4✔
100
                return err
×
101
        }
×
102

103
        if err := renderList(mod.Structs, newDir, proc); err != nil {
4✔
104
                return err
×
105
        }
×
106
        if err := renderList(mod.Traits, newDir, proc); err != nil {
4✔
107
                return err
×
108
        }
×
109
        if err := renderList(mod.Functions, newDir, proc); err != nil {
4✔
110
                return err
×
111
        }
×
112

113
        text, err := renderElement(mod, proc)
4✔
114
        if err != nil {
4✔
115
                return err
×
116
        }
×
117
        if err := linkAndWrite(text, newDir, len(newDir), "module", proc); err != nil {
4✔
118
                return err
×
119
        }
×
120

121
        return nil
4✔
122
}
123

124
func renderList[T interface {
125
        Named
126
        Kinded
127
}](list []T, dir []string, proc *Processor) error {
24✔
128
        for _, elem := range list {
31✔
129
                newDir := appendNew(dir, elem.GetFileName())
7✔
130
                text, err := renderElement(elem, proc)
7✔
131
                if err != nil {
7✔
132
                        return err
×
133
                }
×
134
                if err := linkAndWrite(text, newDir, len(dir), elem.GetKind(), proc); err != nil {
7✔
135
                        return err
×
136
                }
×
137
        }
138
        return nil
24✔
139
}
140

141
func loadTemplates(f Formatter, additional ...string) (*template.Template, error) {
6✔
142
        allTemplates, err := findTemplatesFS()
6✔
143
        if err != nil {
6✔
144
                return nil, err
×
145
        }
×
146
        templ, err := template.New("all").Funcs(template.FuncMap{
6✔
147
                "toLink": f.ToLinkPath,
6✔
148
        }).ParseFS(assets.Templates, allTemplates...)
6✔
149
        if err != nil {
6✔
150
                return nil, err
×
151
        }
×
152
        for _, dir := range additional {
6✔
153
                moreTemplates, err := findTemplates(dir)
×
154
                if err != nil {
×
155
                        return nil, err
×
156
                }
×
157
                templ, err = templ.ParseFiles(moreTemplates...)
×
158
                if err != nil {
×
159
                        return nil, err
×
160
                }
×
161
        }
162
        return templ, nil
6✔
163
}
164

165
func findTemplatesFS() ([]string, error) {
6✔
166
        allTemplates := []string{}
6✔
167
        err := fs.WalkDir(assets.Templates, ".",
6✔
168
                func(path string, info os.DirEntry, err error) error {
180✔
169
                        if err != nil {
174✔
170
                                return err
×
171
                        }
×
172
                        if !info.IsDir() {
318✔
173
                                allTemplates = append(allTemplates, path)
144✔
174
                        }
144✔
175
                        return nil
174✔
176
                })
177
        if err != nil {
6✔
178
                return nil, err
×
179
        }
×
180
        return allTemplates, nil
6✔
181
}
182

183
func findTemplates(dir string) ([]string, error) {
×
184
        allTemplates := []string{}
×
185
        err := filepath.WalkDir(dir,
×
186
                func(path string, info os.DirEntry, err error) error {
×
187
                        if err != nil {
×
188
                                return err
×
189
                        }
×
190
                        if !info.IsDir() {
×
191
                                allTemplates = append(allTemplates, path)
×
192
                        }
×
193
                        return nil
×
194
                })
195
        if err != nil {
×
196
                return nil, err
×
197
        }
×
198
        return allTemplates, nil
×
199
}
200

201
func linkAndWrite(text string, dir []string, modElems int, kind string, proc *Processor) error {
15✔
202
        text, err := proc.ReplacePlaceholders(text, dir[1:], modElems-1)
15✔
203
        if err != nil {
15✔
204
                return err
×
205
        }
×
206
        outFile, err := proc.Formatter.ToFilePath(path.Join(dir...), kind)
15✔
207
        if err != nil {
15✔
208
                return err
×
209
        }
×
210
        return proc.WriteFile(outFile, text)
15✔
211
}
212

213
func mkDirs(path string) error {
8✔
214
        if err := os.MkdirAll(path, os.ModePerm); err != nil && !os.IsExist(err) {
8✔
215
                return err
×
216
        }
×
217
        return nil
8✔
218
}
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