-
Notifications
You must be signed in to change notification settings - Fork 2
/
process.go
98 lines (83 loc) · 3.07 KB
/
process.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
package main
import (
"fmt"
"path/filepath"
"github.com/pkg/errors"
"github.com/qawatake/obsdconv/convert"
"github.com/qawatake/obsdconv/process"
)
type processorImplWithErrHandling struct {
debug bool
sub process.Processor
errbuf []error
}
func newProcessorImplWithErrHandling(debug bool, subprocessor process.Processor) *processorImplWithErrHandling {
return &processorImplWithErrHandling{
debug: debug,
sub: subprocessor,
}
}
func (p *processorImplWithErrHandling) Process(relativePath, orgpath, newpath string) error {
err := p.sub.Process(relativePath, orgpath, newpath)
if err == nil {
return nil
}
// 予想済みのエラーの場合は処理を止めずに, エラー出力だけする
public, debug, buffered := handleErr(orgpath, err)
if public == nil && debug == nil {
if buffered != nil {
p.errbuf = append(p.errbuf, buffered)
}
return nil
}
if p.debug {
return debug
} else {
return public
}
}
func newDefaultProcessor(config *configuration) (processor *processorImplWithErrHandling, err error) {
skipper, err := process.NewSkipper(filepath.Join(config.src, DEFAULT_IGNORE_FILE_NAME))
if err != nil {
return nil, err
}
db := process.WrapForSkipping(convert.NewPathDB(config.src), skipper)
if config.strictref {
db = convert.WrapForReturningNotFoundPathError(db)
}
pathPrefixRemap, err := parsePathPrefixRemap(config.remapPathPrefix)
if err != nil {
return nil, err
}
bc := newBodyConverterImpl(db, config.cptag || config.synctag, config.rmtag, config.cmmt, config.title || config.alias || config.synctlal, config.link, config.rmH1, config.formatLink, config.formatAnchor, pathPrefixRemap)
metaKeyRemap, err := parseRemap(config.remapkey)
if err != nil {
return nil, err
}
yc := newYamlConverterImpl(config.synctag, config.synctlal, config.publishable, metaKeyRemap)
passer := newArgPasserImpl(config.title || config.synctlal, config.alias || config.synctlal)
examinator := newYamlExaminatorImpl(config.filter, config.publishable)
return newProcessorImplWithErrHandling(config.debug, process.NewProcessor(bc, yc, passer, examinator)), nil
}
func handleErr(path string, err error) (public error, debug error, buffered error) {
orgErr := errors.Cause(err)
e, ok := orgErr.(convert.ErrConvert)
if !ok {
e := fmt.Errorf("[FATAL] path: %s | %v", path, err)
return e, e, nil
}
line := e.Line()
ee, ok := errors.Cause(e.Source()).(convert.ErrTransform)
if !ok {
public = fmt.Errorf("[FATAL] path: %s, around line: %d | failed to convert", path, line)
debug = fmt.Errorf("[FATAL] path: %s, around line: %d | cause of source of ErrConvert does not implement ErrTransform: ErrConvert: %w", path, line, e)
return public, debug, nil
}
if ee.Kind() == convert.ERR_KIND_UNEXPECTED {
public = fmt.Errorf("[FATAL] path: %s, around line: %d | failed to convert", path, line)
debug = fmt.Errorf("[FATAL] path: %s, around line: %d | undefined kind of ErrTransform: ErrTransform: %w", path, line, ee)
return public, debug, nil
}
// 想定済みのエラー
return nil, nil, errors.Wrapf(ee, "[ERROR] path: %s, around line: %d", path, line)
}