-
Notifications
You must be signed in to change notification settings - Fork 7
/
main.go
136 lines (119 loc) · 4.64 KB
/
main.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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package main
import (
"fmt"
"io/ioutil"
"net/http"
"os"
"path"
"strings"
"time"
"github.com/anz-bank/sysl/pkg/loader"
"github.com/anz-bank/sysl/pkg/sysl"
"github.com/anz-bank/sysl-catalog/pkg/catalog"
"github.com/anz-bank/sysl-catalog/pkg/watcher"
"github.com/gohugoio/hugo/livereload"
"github.com/sirupsen/logrus"
log "github.com/sirupsen/logrus"
"github.com/spf13/afero"
"gopkg.in/alecthomas/kingpin.v2"
)
var (
input = kingpin.Arg("input", "Input sysl file to generate documentation for").Required().String()
plantUMLoption = kingpin.Flag("plantuml", "Plantuml service to use").String()
port = kingpin.Flag("port", "Port to serve on").Short('p').Default(":6900").String()
outputType = kingpin.Flag("type", "Type of output").HintOptions("html", "markdown").Default("markdown").String()
outputDir = kingpin.Flag("output", "OutputDir directory to generate to").Short('o').String()
verbose = kingpin.Flag("verbose", "Verbose logs").Short('v').Bool()
templates = kingpin.Flag("templates", "Custom templates to use, separated by a comma").String()
outputFileName = kingpin.Flag("outputFileName", "Output file name for pages; {{.Title}}").Default("").String()
server = kingpin.Flag("serve", "Start a http server and preview documentation").Bool()
noCSS = kingpin.Flag("noCSS", "Disable adding css to served html").Bool()
disableLiveReload = kingpin.Flag("disableLiveReload", "Disable live reload").Default("false").Bool()
noImages = kingpin.Flag("noImages", "Disable image generation").Default("false").Bool()
embed = kingpin.Flag("embed", "Embed images instead of creating svgs").Default("false").Bool()
enableMermaid = kingpin.Flag("mermaid", "Enable mermaid for diagram generation instead of Plantuml (Not currently supported)").Default("false").Bool()
enableRedoc = kingpin.Flag("redoc", "Enable Redoc generation for specs imported from OpenAPI. Must be run on a git repo.").Default("false").Bool()
imageDest = kingpin.Flag("imageDest", "Optional image directory destination (can be outside of the path provided using --output)").String()
)
func main() {
kingpin.Parse()
logger := setupLogger()
plantUMLService := plantUMLService()
fs := afero.NewOsFs()
if !*server {
m, err := parseSyslFile(".", *input, fs, logger)
if err != nil {
logger.Fatal(err)
}
catalog.NewProject(*input, plantUMLService, *outputType, logger, m, fs, *outputDir).
SetOptions(*noCSS, *noImages, *embed, *enableRedoc, *enableMermaid, *outputFileName, *imageDest).
WithTemplateFs(fs, strings.Split(*templates, ",")...).
Run()
return
}
if *outputType == "markdown" {
logger.Warn("Server mode uses html as output type by default")
}
if *outputDir != "" {
logger.Warn("OutputDir is ignored in server mode")
}
handler := catalog.NewProject(*input, plantUMLService, "html", logger, nil, nil, "").
SetOptions(*noCSS, *noImages, *embed, *enableRedoc, *enableMermaid, *outputFileName, *imageDest).
WithTemplateFs(fs, strings.Split(*templates, ",")...).
ServerSettings(*noCSS, !*disableLiveReload, true)
logrus.SetOutput(ioutil.Discard)
go watcher.WatchFile(func(i interface{}) {
logger.Info("Regenerating...")
m, err := func() (m *sysl.Module, err error) {
defer func() {
if r := recover(); r != nil {
m = nil
err = fmt.Errorf("%s", r)
}
}()
m, err = parseSyslFile(".", *input, fs, logger)
return
}()
if err != nil {
fmt.Println(err)
}
handler.Update(m, err)
livereload.ForceRefresh()
logger.Info(i)
logger.Info("Done Regenerating")
}, path.Dir(*input))
http.Handle("/", handler)
livereload.Initialize()
http.HandleFunc("/livereload.js", livereload.ServeJS)
http.HandleFunc("/livereload", livereload.Handler)
fmt.Println("Serving on http://localhost" + *port)
logger.Fatal(http.ListenAndServe(*port, nil))
}
func plantUMLService() string {
plantUMLService := os.Getenv("SYSL_PLANTUML")
if *plantUMLoption != "" {
plantUMLService = *plantUMLoption
}
if plantUMLService == "" {
log.Fatal("Error: Set SYSL_PLANTUML env variable or --plantuml flag")
}
return plantUMLService
}
func setupLogger() *logrus.Logger {
logger := logrus.New()
if *verbose {
logger.SetLevel(logrus.InfoLevel)
} else {
logger.SetLevel(logrus.ErrorLevel)
logrus.SetLevel(logrus.ErrorLevel)
}
return logger
}
func parseSyslFile(root string, filename string, fs afero.Fs, logger *logrus.Logger) (*sysl.Module, error) {
logger.Info("Parsing...")
start := time.Now()
m, _, err := loader.LoadSyslModule(root, filename, fs, logger)
elapsed := time.Since(start)
logger.Info("Done, time elapsed: ", elapsed)
return m, err
}