/
loader.go
111 lines (90 loc) · 2.49 KB
/
loader.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
// SPDX-License-Identifier: MIT
// Package loader 加载数据内容
//
// 仅加载各个模块的自身的数据,并判断格式是否正确。
// 但是不会对各个模块之间的关联数据进行校验。
package loader
import (
"fmt"
"io/fs"
"mime"
"path"
"github.com/issue9/validation/is"
"gopkg.in/yaml.v2"
)
// 排序方式
const (
OrderDesc = "desc"
OrderAsc = "asc"
)
// FieldError 表示配置项内容的错误信息
type FieldError struct {
File string
Field string
Message string
Value interface{}
}
// Link 描述链接的内容
type Link struct {
URL string `yaml:"url"` // 链接地址
Text string `yaml:"text"` // 链接的文本
}
// Icon 表示网站图标,比如 html>head>link.rel="short icon"
type Icon struct {
URL string `yaml:"url"`
Type string `yaml:"type"` // mime type
Sizes string `yaml:"sizes"`
}
// Author 描述作者信息
type Author struct {
Name string `yaml:"name"`
URL string `yaml:"url,omitempty"`
Email string `yaml:"email,omitempty"`
Avatar string `yaml:"avatar,omitempty"`
}
func (err *FieldError) Error() string {
if err.Value == nil {
return fmt.Sprintf("%s 位于 %s:%s", err.Message, err.File, err.Field)
}
return fmt.Sprintf("%s 位于 %s:%s,实际值为:%#v", err.Message, err.File, err.Field, err.Value)
}
func loadYAML(f fs.FS, path string, v interface{}) error {
data, err := fs.ReadFile(f, path)
if err != nil {
return err
}
return yaml.Unmarshal(data, v)
}
func (icon *Icon) sanitize() *FieldError {
if len(icon.URL) == 0 {
return &FieldError{Field: "url", Message: "不能为空"}
}
if icon.Type == "" {
icon.Type = mime.TypeByExtension(path.Ext(icon.URL))
}
return nil
}
func (l *Link) sanitize() *FieldError {
if len(l.Text) == 0 {
return &FieldError{Field: "text", Message: "不能为空"}
}
if len(l.URL) == 0 {
return &FieldError{Field: "url", Message: "不能为空"}
}
return nil
}
func (author *Author) sanitize() *FieldError {
if len(author.Name) == 0 {
return &FieldError{Field: "name", Message: "不能为空"}
}
if len(author.URL) > 0 && !is.URL(author.URL) {
return &FieldError{Field: "url", Message: "不是一个正确的 URL", Value: author.URL}
}
if len(author.Avatar) > 0 && !is.URL(author.Avatar) {
return &FieldError{Field: "avatar", Message: "不是一个正确的 URL", Value: author.Avatar}
}
if len(author.Email) > 0 && !is.Email(author.Email) {
return &FieldError{Field: "email", Message: "不是一个正确的 Email", Value: author.Email}
}
return nil
}