From fabced291caaa16314c0ae3e90d14ddc7b776a68 Mon Sep 17 00:00:00 2001 From: Max Date: Tue, 13 May 2025 09:10:10 +0800 Subject: [PATCH] fix: Enhance loading functions to handle non-existent directories - Added checks in various loading functions to ignore processing if the respective directories do not exist, improving error handling and preventing unnecessary operations. - Updated the Load function signature to return warnings alongside errors, allowing for better feedback on loading issues across different components. --- aigc/load.go | 12 ++- api/api.go | 11 ++- cert/cert.go | 11 +++ cmd/dump.go | 8 +- cmd/migrate.go | 8 +- cmd/restore.go | 8 +- cmd/run.go | 13 +++- cmd/start.go | 23 +++++- cmd/studio/run.go | 7 +- cmd/sui/build.go | 9 ++- cmd/sui/trans.go | 9 ++- cmd/sui/watch.go | 8 +- engine/load.go | 129 ++++++++++++++++++++++----------- engine/load_test.go | 8 +- flow/flow.go | 10 +++ i18n/i18n.go | 10 +++ importer/importer.go | 5 ++ pipe/pipe.go | 11 ++- plugin/plugin.go | 6 ++ schedule/schedule.go | 12 ++- service/service_test.go | 2 +- service/watch_test.go | 2 +- store/store.go | 12 ++- task/task.go | 12 ++- widget/load.go | 11 ++- widgets/chart/chart.go | 12 ++- widgets/dashboard/dashboard.go | 12 ++- widgets/form/form.go | 12 ++- widgets/list/list.go | 11 ++- widgets/login/login.go | 10 +++ widgets/table/table.go | 12 ++- 31 files changed, 357 insertions(+), 69 deletions(-) diff --git a/aigc/load.go b/aigc/load.go index c650a164..a7995689 100644 --- a/aigc/load.go +++ b/aigc/load.go @@ -11,9 +11,19 @@ import ( // Load load AIGC func Load(cfg config.Config) error { + + // Ignore if the aigcs directory does not exist + exists, err := application.App.Exists("aigcs") + if err != nil { + return err + } + if !exists { + return nil + } + exts := []string{"*.ai.yml", "*.ai.yaml"} messages := []string{} - err := application.App.Walk("aigcs", func(root, file string, isdir bool) error { + err = application.App.Walk("aigcs", func(root, file string, isdir bool) error { if isdir { return nil } diff --git a/api/api.go b/api/api.go index 99297e99..16d2b78f 100644 --- a/api/api.go +++ b/api/api.go @@ -14,8 +14,17 @@ import ( func Load(cfg config.Config) error { messages := []string{} + // Ignore if the apis directory does not exist + exists, err := application.App.Exists("apis") + if err != nil { + return err + } + if !exists { + return nil + } + exts := []string{"*.http.yao", "*.http.json", "*.http.jsonc"} - err := application.App.Walk("apis", func(root, file string, isdir bool) error { + err = application.App.Walk("apis", func(root, file string, isdir bool) error { if isdir { return nil } diff --git a/cert/cert.go b/cert/cert.go index 39a0329f..99e2407e 100644 --- a/cert/cert.go +++ b/cert/cert.go @@ -11,6 +11,17 @@ import ( // Load 加载API func Load(cfg config.Config) error { + + // Ignore if the certs directory does not exist + exists, err := application.App.Exists("certs") + if err != nil { + return err + } + + if !exists { + return nil + } + exts := []string{"*.pem", "*.key", "*.pub"} return application.App.Walk("certs", func(root, file string, isdir bool) error { if isdir { diff --git a/cmd/dump.go b/cmd/dump.go index eb820808..a68823ca 100644 --- a/cmd/dump.go +++ b/cmd/dump.go @@ -57,12 +57,18 @@ var dumpCmd = &cobra.Command{ } // Load model - err = engine.Load(config.Conf, engine.LoadOption{Action: "dump"}) + loadWarnings, err := engine.Load(config.Conf, engine.LoadOption{Action: "dump"}) if err != nil { fmt.Println(color.RedString(L("Fatal: %s"), err.Error())) os.Exit(1) } + if len(loadWarnings) > 0 { + for _, warning := range loadWarnings { + fmt.Println(color.YellowString("[%s] %s", warning.Widget, warning.Error)) + } + } + if dumpModel != "" { fmt.Println(color.YellowString(L("Not supported yet"))) os.Exit(1) diff --git a/cmd/migrate.go b/cmd/migrate.go index 3ebf0a8c..1138ccda 100644 --- a/cmd/migrate.go +++ b/cmd/migrate.go @@ -37,12 +37,18 @@ var migrateCmd = &cobra.Command{ } // 加载数据模型 - err := engine.Load(config.Conf, engine.LoadOption{Action: "migrate"}) + loadWarnings, err := engine.Load(config.Conf, engine.LoadOption{Action: "migrate"}) if err != nil { fmt.Println(color.RedString(L("Fatal: %s"), err.Error())) os.Exit(1) } + if len(loadWarnings) > 0 { + for _, warning := range loadWarnings { + fmt.Println(color.YellowString("[%s] %s", warning.Widget, warning.Error)) + } + } + if name != "" { mod, has := model.Models[name] if !has { diff --git a/cmd/restore.go b/cmd/restore.go index d5776111..eac6c37c 100644 --- a/cmd/restore.go +++ b/cmd/restore.go @@ -60,12 +60,18 @@ var restoreCmd = &cobra.Command{ }) // 加载数据模型 - err = engine.Load(config.Conf, engine.LoadOption{Action: "restore"}) + loadWarnings, err := engine.Load(config.Conf, engine.LoadOption{Action: "restore"}) if err != nil { fmt.Println(color.RedString(L("Fatal: %s"), err.Error())) os.Exit(1) } + if len(loadWarnings) > 0 { + for _, warning := range loadWarnings { + fmt.Println(color.YellowString("[%s] %s", warning.Widget, warning.Error)) + } + } + // Restore models restoreModels(filepath.Join(dst, "model"), []model.MigrateOption{ model.WithDonotInsertValues(migrateNoInsert), diff --git a/cmd/run.go b/cmd/run.go index 4c094953..12f56e61 100644 --- a/cmd/run.go +++ b/cmd/run.go @@ -57,7 +57,7 @@ var runCmd = &cobra.Command{ return } - err := engine.Load(cfg, engine.LoadOption{Action: "run"}) + loadWarnings, err := engine.Load(cfg, engine.LoadOption{Action: "run"}) if err != nil { if !runSilent { color.Red(L("Engine: %s\n"), err.Error()) @@ -130,6 +130,17 @@ var runCmd = &cobra.Command{ } if !runSilent { + + if len(loadWarnings) > 0 { + fmt.Println(color.YellowString("---------------------------------")) + fmt.Println(color.YellowString(L("Warnings"))) + fmt.Println(color.YellowString("---------------------------------")) + for _, warning := range loadWarnings { + fmt.Println(color.YellowString("[%s] %s", warning.Widget, warning.Error)) + } + fmt.Printf("\n") + } + color.White("--------------------------------------\n") color.White(L("%s Response\n"), name) color.White("--------------------------------------\n") diff --git a/cmd/start.go b/cmd/start.go index a0acb09f..34bb24cd 100644 --- a/cmd/start.go +++ b/cmd/start.go @@ -77,7 +77,7 @@ var startCmd = &cobra.Command{ } // load the application engine - err := engine.Load(config.Conf, engine.LoadOption{Action: "start"}) + loadWarnings, err := engine.Load(config.Conf, engine.LoadOption{Action: "start"}) if err != nil { fmt.Println(color.RedString(L("Load: %s"), err.Error())) os.Exit(1) @@ -232,6 +232,17 @@ var startCmd = &cobra.Command{ printStores(true) } + // Print the warnings + if len(loadWarnings) > 0 { + fmt.Println(color.YellowString("---------------------------------")) + fmt.Println(color.YellowString(L("Warnings"))) + fmt.Println(color.YellowString("---------------------------------")) + for _, warning := range loadWarnings { + fmt.Println(color.YellowString("[%s] %s", warning.Widget, warning.Error)) + } + fmt.Printf("\n") + } + for { select { case v := <-srv.Event(): @@ -275,11 +286,19 @@ func install() error { Boot() // load the application engine - err = engine.Load(config.Conf, engine.LoadOption{Action: "start"}) + loadWarnings, err := engine.Load(config.Conf, engine.LoadOption{Action: "start"}) if err != nil { return err } + // Print the warnings + if len(loadWarnings) > 0 { + for _, warning := range loadWarnings { + fmt.Println(color.YellowString("[%s] %s", warning.Widget, warning.Error)) + } + fmt.Printf("\n\n") + } + err = setup.Initialize(config.Conf.Root, config.Conf) if err != nil { return err diff --git a/cmd/studio/run.go b/cmd/studio/run.go index 02690d84..ef46f209 100644 --- a/cmd/studio/run.go +++ b/cmd/studio/run.go @@ -18,6 +18,11 @@ import ( "github.com/yaoapp/yao/studio" ) +// ********************************************************************************* +// !! Yao Studio Command has been deprecated. +// !! Do not use this command in your project. +// ********************************************************************************* + // RunCmd command var RunCmd = &cobra.Command{ Use: "run", @@ -43,7 +48,7 @@ var RunCmd = &cobra.Command{ return } - err := engine.Load(cfg, engine.LoadOption{Action: "studio.run"}) + _, err := engine.Load(cfg, engine.LoadOption{Action: "studio.run"}) if err != nil { fmt.Println(color.RedString(L("Engine: %s"), err.Error())) } diff --git a/cmd/sui/build.go b/cmd/sui/build.go index 4fb0fafe..d19c38c1 100644 --- a/cmd/sui/build.go +++ b/cmd/sui/build.go @@ -31,7 +31,7 @@ var BuildCmd = &cobra.Command{ Boot() cfg := config.Conf - err := engine.Load(cfg, engine.LoadOption{Action: "sui.build"}) + loadWarnings, err := engine.Load(cfg, engine.LoadOption{Action: "sui.build"}) if err != nil { fmt.Fprintln(os.Stderr, color.RedString(err.Error())) return @@ -99,6 +99,13 @@ var BuildCmd = &cobra.Command{ fmt.Println(color.YellowString("Build succeeded for %s in %s", mode, timecost)) return } + + if len(loadWarnings) > 0 { + for _, warning := range loadWarnings { + fmt.Println(color.YellowString("[%s] %s", warning.Widget, warning.Error)) + } + } + if len(warnings) > 0 { for _, warning := range warnings { fmt.Println(color.YellowString("Warning: %s", warning)) diff --git a/cmd/sui/trans.go b/cmd/sui/trans.go index 32caaed8..3c753d32 100644 --- a/cmd/sui/trans.go +++ b/cmd/sui/trans.go @@ -32,7 +32,7 @@ var TransCmd = &cobra.Command{ Boot() cfg := config.Conf - err := engine.Load(cfg, engine.LoadOption{Action: "sui.trans"}) + loadWarnings, err := engine.Load(cfg, engine.LoadOption{Action: "sui.trans"}) if err != nil { fmt.Fprintln(os.Stderr, color.RedString(err.Error())) return @@ -135,6 +135,13 @@ var TransCmd = &cobra.Command{ fmt.Println(color.YellowString("Translate succeeded for %s in %s", mode, timecost)) return } + + if len(loadWarnings) > 0 { + for _, warning := range loadWarnings { + fmt.Println(color.YellowString("[%s] %s", warning.Widget, warning.Error)) + } + } + if len(warnings) > 0 { for _, warning := range warnings { fmt.Println(color.YellowString("Warning: %s", warning)) diff --git a/cmd/sui/watch.go b/cmd/sui/watch.go index b9412d26..74c77aab 100644 --- a/cmd/sui/watch.go +++ b/cmd/sui/watch.go @@ -39,12 +39,18 @@ var WatchCmd = &cobra.Command{ Boot() cfg := config.Conf - err := engine.Load(cfg, engine.LoadOption{Action: "sui.watch"}) + loadWarnings, err := engine.Load(cfg, engine.LoadOption{Action: "sui.watch"}) if err != nil { fmt.Fprintln(os.Stderr, color.RedString(err.Error())) return } + if len(loadWarnings) > 0 { + for _, warning := range loadWarnings { + fmt.Println(color.YellowString("[%s] %s", warning.Widget, warning.Error)) + } + } + id := args[0] template := args[1] diff --git a/engine/load.go b/engine/load.go index 3f785289..067db86d 100644 --- a/engine/load.go +++ b/engine/load.go @@ -19,7 +19,6 @@ import ( "github.com/yaoapp/yao/flow" "github.com/yaoapp/yao/fs" "github.com/yaoapp/yao/i18n" - "github.com/yaoapp/yao/importer" "github.com/yaoapp/yao/moapi" "github.com/yaoapp/yao/model" "github.com/yaoapp/yao/neo" @@ -60,8 +59,14 @@ type LoadOption struct { IsReload bool `json:"reload"` } +// Warning the warning +type Warning struct { + Widget string + Error error +} + // Load application engine -func Load(cfg config.Config, options LoadOption) (err error) { +func Load(cfg config.Config, options LoadOption) (warnings []Warning, err error) { defer func() { err = exception.Catch(recover()) }() exception.Mode = cfg.Mode @@ -79,78 +84,91 @@ func Load(cfg config.Config, options LoadOption) (err error) { err = loadApp(cfg.AppSource) if err != nil { printErr(cfg.Mode, "Load Application", err) + warnings = append(warnings, Warning{Widget: "Load Application", Error: err}) } // Make Database connections err = share.DBConnect(cfg.DB) if err != nil { - printErr(cfg.Mode, "DB", err) + // printErr(cfg.Mode, "DB", err) + warnings = append(warnings, Warning{Widget: "DB", Error: err}) } // Load Certs err = cert.Load(cfg) if err != nil { - printErr(cfg.Mode, "Cert", err) + // printErr(cfg.Mode, "Cert", err) + warnings = append(warnings, Warning{Widget: "Cert", Error: err}) } // Load Connectors err = connector.Load(cfg) if err != nil { - printErr(cfg.Mode, "Connector", err) + // printErr(cfg.Mode, "Connector", err) + warnings = append(warnings, Warning{Widget: "Connector", Error: err}) } // Load FileSystem err = fs.Load(cfg) if err != nil { - printErr(cfg.Mode, "FileSystem", err) + // printErr(cfg.Mode, "FileSystem", err) + warnings = append(warnings, Warning{Widget: "FileSystem", Error: err}) } // Load i18n err = i18n.Load(cfg) if err != nil { - printErr(cfg.Mode, "i18n", err) + // printErr(cfg.Mode, "i18n", err) + warnings = append(warnings, Warning{Widget: "i18n", Error: err}) } // start v8 runtime err = runtime.Start(cfg) if err != nil { - printErr(cfg.Mode, "Runtime", err) + // printErr(cfg.Mode, "Runtime", err) + warnings = append(warnings, Warning{Widget: "Runtime", Error: err}) } // Load Query Engine err = query.Load(cfg) if err != nil { - printErr(cfg.Mode, "Query Engine", err) + // printErr(cfg.Mode, "Query Engine", err) + warnings = append(warnings, Warning{Widget: "Query Engine", Error: err}) } // Load Scripts err = script.Load(cfg) if err != nil { - printErr(cfg.Mode, "Script", err) + // printErr(cfg.Mode, "Script", err) + warnings = append(warnings, Warning{Widget: "Script", Error: err}) } // Load Models err = model.Load(cfg) if err != nil { - printErr(cfg.Mode, "Model", err) + // printErr(cfg.Mode, "Model", err) + warnings = append(warnings, Warning{Widget: "Model", Error: err}) } // Load Data flows err = flow.Load(cfg) if err != nil { - printErr(cfg.Mode, "Flow", err) + // printErr(cfg.Mode, "Flow", err) + warnings = append(warnings, Warning{Widget: "Flow", Error: err}) } // Load Stores err = store.Load(cfg) if err != nil { - printErr(cfg.Mode, "Store", err) + // printErr(cfg.Mode, "Store", err) + warnings = append(warnings, Warning{Widget: "Store", Error: err}) } // Load Plugins err = plugin.Load(cfg) if err != nil { - printErr(cfg.Mode, "Plugin", err) + // printErr(cfg.Mode, "Plugin", err) + warnings = append(warnings, Warning{Widget: "Plugin", Error: err}) } // Load WASM Application (experimental) @@ -158,91 +176,106 @@ func Load(cfg config.Config, options LoadOption) (err error) { // Load build-in widgets (table / form / chart / ...) err = widgets.Load(cfg) if err != nil { - printErr(cfg.Mode, "Widgets", err) + // printErr(cfg.Mode, "Widgets", err) + warnings = append(warnings, Warning{Widget: "Widgets", Error: err}) } // Load Importers - err = importer.Load(cfg) - if err != nil { - printErr(cfg.Mode, "Plugin", err) - } + // err = importer.Load(cfg) + // if err != nil { + // // printErr(cfg.Mode, "Plugin", err) + // warnings = append(warnings, Warning{Widget: "Plugin", Error: err}) + // } // Load Apis err = api.Load(cfg) // 加载业务接口 API if err != nil { - printErr(cfg.Mode, "API", err) + // printErr(cfg.Mode, "API", err) + warnings = append(warnings, Warning{Widget: "API", Error: err}) } // Load Sockets err = socket.Load(cfg) // Load sockets if err != nil { - printErr(cfg.Mode, "Socket", err) + // printErr(cfg.Mode, "Socket", err) + warnings = append(warnings, Warning{Widget: "Socket", Error: err}) } // Load websockets (client mode) err = websocket.Load(cfg) if err != nil { - printErr(cfg.Mode, "WebSocket", err) + // printErr(cfg.Mode, "WebSocket", err) + warnings = append(warnings, Warning{Widget: "WebSocket", Error: err}) } // Load tasks err = task.Load(cfg) if err != nil { - printErr(cfg.Mode, "Task", err) + // printErr(cfg.Mode, "Task", err) + warnings = append(warnings, Warning{Widget: "Task", Error: err}) } // Load schedules err = schedule.Load(cfg) if err != nil { - printErr(cfg.Mode, "Schedule", err) + // printErr(cfg.Mode, "Schedule", err) + warnings = append(warnings, Warning{Widget: "Schedule", Error: err}) } // Load AIGC err = aigc.Load(cfg) if err != nil { - printErr(cfg.Mode, "AIGC", err) - } - - // Load Neo - err = neo.Load(cfg) - if err != nil { - printErr(cfg.Mode, "Neo", err) + // printErr(cfg.Mode, "AIGC", err) + warnings = append(warnings, Warning{Widget: "AIGC", Error: err}) } // Load Custom Widget err = widget.Load(cfg) if err != nil { - printErr(cfg.Mode, "Widget", err) + // printErr(cfg.Mode, "Widget", err) + warnings = append(warnings, Warning{Widget: "Widget", Error: err}) } // Load Custom Widget Instances err = widget.LoadInstances() if err != nil { - printErr(cfg.Mode, "Widget", err) + // printErr(cfg.Mode, "Widget", err) + warnings = append(warnings, Warning{Widget: "Widget", Error: err}) } // Load SUI err = sui.Load(cfg) if err != nil { - printErr(cfg.Mode, "SUI", err) + // printErr(cfg.Mode, "SUI", err) + warnings = append(warnings, Warning{Widget: "SUI", Error: err}) } // Load Moapi err = moapi.Load(cfg) if err != nil { - printErr(cfg.Mode, "Moapi", err) + // printErr(cfg.Mode, "Moapi", err) + warnings = append(warnings, Warning{Widget: "Moapi", Error: err}) } // Load Pipe err = pipe.Load(cfg) if err != nil { - printErr(cfg.Mode, "Pipe", err) + // printErr(cfg.Mode, "Pipe", err) + warnings = append(warnings, Warning{Widget: "Pipe", Error: err}) + } + + // Load Neo + err = neo.Load(cfg) + if err != nil { + // printErr(cfg.Mode, "Neo", err) + warnings = append(warnings, Warning{Widget: "Neo", Error: err}) } for name, hook := range LoadHooks { err = hook(cfg) if err != nil { - printErr(cfg.Mode, name, err) + // printErr(cfg.Mode, name, err) + warnings = append(warnings, Warning{Widget: name, Error: err}) } } @@ -251,17 +284,19 @@ func Load(cfg config.Config, options LoadOption) (err error) { p, err := process.Of(share.App.AfterLoad, options) if err != nil { printErr(cfg.Mode, "AfterLoad", err) - return err + warnings = append(warnings, Warning{Widget: "AfterLoad", Error: err}) + return warnings, err } _, err = p.Exec() if err != nil { printErr(cfg.Mode, "AfterLoad", err) - return err + warnings = append(warnings, Warning{Widget: "AfterLoad", Error: err}) + return warnings, err } } - return nil + return warnings, nil } // Unload application engine @@ -458,7 +493,19 @@ func Restart(cfg config.Config, options LoadOption) error { if err != nil { return err } - return Load(cfg, options) + + warnings, err := Load(cfg, options) + if err != nil { + return err + } + + if len(warnings) > 0 { + for _, warning := range warnings { + printErr(cfg.Mode, warning.Widget, warning.Error) + } + } + + return nil } // loadApp load the application from bindata / pkg / disk diff --git a/engine/load_test.go b/engine/load_test.go index e0b02a2b..0427a9cc 100644 --- a/engine/load_test.go +++ b/engine/load_test.go @@ -13,14 +13,14 @@ import ( func TestLoad(t *testing.T) { defer Unload() - err := Load(config.Conf, LoadOption{}) + _, err := Load(config.Conf, LoadOption{}) assert.Nil(t, err) assert.Greater(t, len(api.APIs), 0) } func TestReload(t *testing.T) { defer Unload() - err := Load(config.Conf, LoadOption{}) + _, err := Load(config.Conf, LoadOption{}) assert.Nil(t, err) Reload(config.Conf, LoadOption{}) @@ -41,7 +41,7 @@ func TestLoadYaz(t *testing.T) { cfg := config.Conf cfg.AppSource = file - err = Load(cfg, LoadOption{}) + _, err = Load(cfg, LoadOption{}) if err != nil { t.Fatal(err) } @@ -62,7 +62,7 @@ func TestReoadYaz(t *testing.T) { cfg := config.Conf cfg.AppSource = file - err = Load(cfg, LoadOption{}) + _, err = Load(cfg, LoadOption{}) if err != nil { t.Fatal(err) } diff --git a/flow/flow.go b/flow/flow.go index 9b5e07cf..fac96af0 100644 --- a/flow/flow.go +++ b/flow/flow.go @@ -9,6 +9,16 @@ import ( // Load 加载业务逻辑编排 func Load(cfg config.Config) error { + + // Ignore if the flows directory does not exist + exists, err := application.App.Exists("flows") + if err != nil { + return err + } + if !exists { + return nil + } + exts := []string{"*.flow.yao", "*.flow.json", "*.flow.jsonc"} return application.App.Walk("flows", func(root, file string, isdir bool) error { if isdir { diff --git a/i18n/i18n.go b/i18n/i18n.go index b4e437e5..3c3b1a67 100644 --- a/i18n/i18n.go +++ b/i18n/i18n.go @@ -7,6 +7,7 @@ import ( "sync" "time" + "github.com/yaoapp/gou/application" "github.com/yaoapp/gou/lang" "github.com/yaoapp/kun/log" "github.com/yaoapp/yao/config" @@ -43,6 +44,15 @@ func Load(cfg config.Config) error { return err } + // Ignore if the langs directory does not exist + exists, err := application.App.Exists("langs") + if err != nil { + return err + } + if !exists { + return nil + } + // Load langs err = lang.Load("langs") if err != nil { diff --git a/importer/importer.go b/importer/importer.go index 96832950..5b720c31 100644 --- a/importer/importer.go +++ b/importer/importer.go @@ -20,6 +20,11 @@ import ( "github.com/yaoapp/yao/share" ) +// ********************************************************************************* +// !! Importer has been deprecated. +// !! Do not use this in your project. +// ********************************************************************************* + // Importers 导入器 var Importers = map[string]*Importer{} diff --git a/pipe/pipe.go b/pipe/pipe.go index 5612c16d..0c898a4c 100644 --- a/pipe/pipe.go +++ b/pipe/pipe.go @@ -15,9 +15,18 @@ var pipes = map[string]*Pipe{} // Load the pipe func Load(cfg config.Config) error { + // Ignore if the pipes directory does not exist + exists, err := application.App.Exists("pipes") + if err != nil { + return err + } + if !exists { + return nil + } + exts := []string{"*.pip.yao", "*.pipe.yao"} errs := []error{} - err := application.App.Walk("pipes", func(root, file string, isdir bool) error { + err = application.App.Walk("pipes", func(root, file string, isdir bool) error { if isdir { return nil } diff --git a/plugin/plugin.go b/plugin/plugin.go index 7437daa8..07e830d2 100644 --- a/plugin/plugin.go +++ b/plugin/plugin.go @@ -3,6 +3,7 @@ package plugin import ( "fmt" "io/fs" + "os" "path/filepath" "strings" @@ -19,6 +20,11 @@ func Load(cfg config.Config) error { return err } + // Ignore if the plugins directory does not exist + if _, err := os.Stat(root); os.IsNotExist(err) { + return nil + } + messages := []string{} err = filepath.Walk(root, func(file string, info fs.FileInfo, err error) error { if info == nil || info.IsDir() { diff --git a/schedule/schedule.go b/schedule/schedule.go index eebeb8ac..311708f1 100644 --- a/schedule/schedule.go +++ b/schedule/schedule.go @@ -13,9 +13,19 @@ import ( // Load load schedule func Load(cfg config.Config) error { + + // Ignore if the tasks directory does not exist + exists, err := application.App.Exists("schedules") + if err != nil { + return err + } + if !exists { + return nil + } + messages := []string{} exts := []string{"*.sch.yao", "*.sch.json", "*.sch.jsonc"} - err := application.App.Walk("schedules", func(root, file string, isdir bool) error { + err = application.App.Walk("schedules", func(root, file string, isdir bool) error { if isdir { return nil } diff --git a/service/service_test.go b/service/service_test.go index e2d41485..a37fcd51 100644 --- a/service/service_test.go +++ b/service/service_test.go @@ -16,7 +16,7 @@ func TestStartStop(t *testing.T) { cfg := config.Conf cfg.Port = 0 - err := engine.Load(cfg, engine.LoadOption{}) + _, err := engine.Load(cfg, engine.LoadOption{}) if err != nil { t.Fatal(err) } diff --git a/service/watch_test.go b/service/watch_test.go index b2f02514..837095f7 100644 --- a/service/watch_test.go +++ b/service/watch_test.go @@ -9,7 +9,7 @@ import ( ) func TestWatch(t *testing.T) { - err := engine.Load(config.Conf, engine.LoadOption{}) + _, err := engine.Load(config.Conf, engine.LoadOption{}) if err != nil { t.Fatal(err) } diff --git a/store/store.go b/store/store.go index 267fa2f7..afd08287 100644 --- a/store/store.go +++ b/store/store.go @@ -12,9 +12,19 @@ import ( // Load load store func Load(cfg config.Config) error { + + // Ignore if the stores directory does not exist + exists, err := application.App.Exists("stores") + if err != nil { + return err + } + if !exists { + return nil + } + messages := []string{} exts := []string{"*.yao", "*.json", "*.jsonc"} - err := application.App.Walk("stores", func(root, file string, isdir bool) error { + err = application.App.Walk("stores", func(root, file string, isdir bool) error { if isdir { return nil } diff --git a/task/task.go b/task/task.go index ef6fe9fc..d411af56 100644 --- a/task/task.go +++ b/task/task.go @@ -13,9 +13,19 @@ import ( // Load load task func Load(cfg config.Config) error { + + // Ignore if the tasks directory does not exist + exists, err := application.App.Exists("tasks") + if err != nil { + return err + } + if !exists { + return nil + } + messages := []string{} exts := []string{"*.yao", "*.json", "*.jsonc"} - err := application.App.Walk("tasks", func(root, file string, isdir bool) error { + err = application.App.Walk("tasks", func(root, file string, isdir bool) error { if isdir { return nil } diff --git a/widget/load.go b/widget/load.go index 5f4fd229..697799a2 100644 --- a/widget/load.go +++ b/widget/load.go @@ -17,10 +17,19 @@ var Widgets = map[string]*DSL{} // Load Widgets func Load(cfg config.Config) error { + // Ignore if the widgets directory does not exist + exists, err := application.App.Exists("widgets") + if err != nil { + return err + } + if !exists { + return nil + } + exts := []string{"*.wid.yao", "*.wid.json", "*.wid.jsonc"} messages := []string{} - err := application.App.Walk("widgets", func(root, file string, isdir bool) error { + err = application.App.Walk("widgets", func(root, file string, isdir bool) error { if isdir { return nil } diff --git a/widgets/chart/chart.go b/widgets/chart/chart.go index a047e9c0..8dae5de1 100644 --- a/widgets/chart/chart.go +++ b/widgets/chart/chart.go @@ -55,9 +55,19 @@ func LoadAndExport(cfg config.Config) error { // Load load task func Load(cfg config.Config) error { + + // Ignore if the charts directory does not exist + exists, err := application.App.Exists("charts") + if err != nil { + return err + } + if !exists { + return nil + } + messages := []string{} exts := []string{"*.yao", "*.json", "*.jsonc"} - err := application.App.Walk("charts", func(root, file string, isdir bool) error { + err = application.App.Walk("charts", func(root, file string, isdir bool) error { if isdir { return nil } diff --git a/widgets/dashboard/dashboard.go b/widgets/dashboard/dashboard.go index 3c0b8689..23f99d70 100644 --- a/widgets/dashboard/dashboard.go +++ b/widgets/dashboard/dashboard.go @@ -55,9 +55,19 @@ func LoadAndExport(cfg config.Config) error { // Load load task func Load(cfg config.Config) error { + + // Ignore if the charts directory does not exist + exists, err := application.App.Exists("dashboards") + if err != nil { + return err + } + if !exists { + return nil + } + messages := []string{} exts := []string{"*.yao", "*.json", "*.jsonc"} - err := application.App.Walk("dashboards", func(root, file string, isdir bool) error { + err = application.App.Walk("dashboards", func(root, file string, isdir bool) error { if isdir { return nil } diff --git a/widgets/form/form.go b/widgets/form/form.go index d9f70ab1..66c3e2d4 100644 --- a/widgets/form/form.go +++ b/widgets/form/form.go @@ -78,9 +78,19 @@ func LoadAndExport(cfg config.Config) error { // Load load task func Load(cfg config.Config) error { + + // Ignore if the charts directory does not exist + exists, err := application.App.Exists("forms") + if err != nil { + return err + } + if !exists { + return nil + } + messages := []string{} exts := []string{"*.form.yao", "*.form.json", "*.form.jsonc"} - err := application.App.Walk("forms", func(root, file string, isdir bool) error { + err = application.App.Walk("forms", func(root, file string, isdir bool) error { if isdir { return nil } diff --git a/widgets/list/list.go b/widgets/list/list.go index 93dca942..5a3fcf11 100644 --- a/widgets/list/list.go +++ b/widgets/list/list.go @@ -68,9 +68,18 @@ func LoadAndExport(cfg config.Config) error { // Load load task func Load(cfg config.Config) error { + // Ignore if the charts directory does not exist + exists, err := application.App.Exists("lists") + if err != nil { + return err + } + if !exists { + return nil + } + messages := []string{} exts := []string{"*.yao", "*.json", "*.jsonc"} - err := application.App.Walk("lists", func(root, file string, isdir bool) error { + err = application.App.Walk("lists", func(root, file string, isdir bool) error { if isdir { return nil } diff --git a/widgets/login/login.go b/widgets/login/login.go index 8a6ab24e..e3427c56 100644 --- a/widgets/login/login.go +++ b/widgets/login/login.go @@ -30,6 +30,16 @@ func LoadAndExport(cfg config.Config) error { // Load load login func Load(cfg config.Config) error { + + // Ignore if the login directory does not exist + exists, err := application.App.Exists("logins") + if err != nil { + return err + } + if !exists { + return nil + } + exts := []string{"*.login.yao", "*.login.json", "*.login.jsonc"} return application.App.Walk("logins", func(root, file string, isdir bool) error { if isdir { diff --git a/widgets/table/table.go b/widgets/table/table.go index 0502c0c7..3507f94a 100644 --- a/widgets/table/table.go +++ b/widgets/table/table.go @@ -107,9 +107,19 @@ func LoadAndExport(cfg config.Config) error { // Load load table dsl func Load(cfg config.Config) error { + + // Ignore if the charts directory does not exist + exists, err := application.App.Exists("tables") + if err != nil { + return err + } + if !exists { + return nil + } + messages := []string{} exts := []string{"*.tab.yao", "*.tab.json", "*.tab.jsonc"} - err := application.App.Walk("tables", func(root, file string, isdir bool) error { + err = application.App.Walk("tables", func(root, file string, isdir bool) error { if isdir { return nil }