// 真正的程序入口,main 主要是作参数的处理。 func run() { start := time.Now() path, err := getConfigFile() if err != nil { erro.Println(err) return } cfg, err := loadConfig(path) if err != nil { erro.Println(err) return } // 比较版本号兼容问题 compatible, err := version.SemVerCompatible(app.Version, cfg.Version) if err != nil { erro.Println(err) return } if !compatible { erro.Println(locale.Sprintf(locale.VersionInCompatible)) return } // 分析文档内容 docs := doc.New() wg := &sync.WaitGroup{} for _, opt := range cfg.Inputs { wg.Add(1) go func(o *input.Options) { if err := input.Parse(docs, o); err != nil { erro.Println(err) } wg.Done() }(opt) } wg.Wait() if len(docs.Title) == 0 { docs.Title = app.DefaultTitle } // 输出内容 cfg.Output.Elapsed = time.Now().Sub(start) if err := output.Render(docs, cfg.Output); err != nil { erro.Println(err) return } info.Println(locale.Sprintf(locale.Complete, cfg.Output.Dir, time.Now().Sub(start))) }
func testParseFile(a *assert.Assertion, lang, path string) { docs := doc.New() a.NotNil(docs) b, found := langs[lang] if !found { a.T().Error("不支持该语言") } parseFile(docs, path, b, nil) a.Equal(2, len(docs.Apis)) api0 := docs.Apis[0] api1 := docs.Apis[1] a.T().Log(api0.Success.Examples[0]) a.T().Log(api1.Success.Examples[0]) a.Equal(api0.URL, "/users/login"). Equal(api1.URL, "/users/login"). Equal(api0.Group, "users"). Equal(api1.Group, "users") if api0.Method == "POST" { a.Equal(api1.Method, "DELETE"). Equal(1, len(api1.Request.Headers)) } else { a.Equal(api0.Method, "DELETE"). Equal(api1.Method, "POST"). Equal(1, len(api0.Request.Headers)) } }
func testParse(a *assert.Assertion, lang string) { o := &Options{ Lang: lang, Dir: "./testdata/" + lang, Recursive: true, } a.NotError(o.Init()) // 初始化扩展名信息 docs := doc.New() err := Parse(docs, o) a.NotError(err). Equal(len(docs.Apis), 2) // doc.xx a.Equal(docs.Title, "title of api"). Equal(docs.Version, "2.9"). Equal(docs.BaseURL, "https://api.caixw.io"). Equal(docs.LicenseName, "MIT"). Equal(docs.LicenseURL, "https://opensources.org/licenses/MIT"). Equal(docs.Content, "\n line1\n line2\n") // test1.xx api0 := docs.Apis[0] api1 := docs.Apis[1] a.Equal(api0.URL, "/users/login"). Equal(api1.URL, "/users/login"). Equal(api0.Group, "users"). Equal(api1.Group, "users") }
// 真正的程序入口,main 主要是作参数的处理。 func run() { start := time.Now() path, err := getConfigFile() if err != nil { app.Errorln(err) return } cfg, err := loadConfig(path) if err != nil { app.Errorln(err) return } // 比较版本号兼容问题 compatible, err := version.SemVerCompatible(app.Version, cfg.Version) if err != nil { app.Errorln(err) return } if !compatible { app.Errorln("当前程序与配置文件中指定的版本号不兼容") return } // 分析文档内容 docs := doc.New() wg := &sync.WaitGroup{} for _, opt := range cfg.Inputs { wg.Add(1) go func(o *input.Options) { if err := input.Parse(docs, o); err != nil { app.Errorln(err) } wg.Done() }(opt) } wg.Wait() if len(docs.Title) == 0 { docs.Title = app.DefaultTitle } // 输出内容 cfg.Output.Elapsed = time.Now().Sub(start) if err := output.Render(docs, cfg.Output); err != nil { app.Errorln(err) return } app.Infoln("完成!文档保存在", cfg.Output.Dir, "总用时", time.Now().Sub(start)) }