//go:build production package app import ( "context" "github.com/wailsapp/wails/v2/internal/binding" "github.com/wailsapp/wails/v2/internal/frontend/desktop" "github.com/wailsapp/wails/v2/internal/frontend/dispatcher" "github.com/wailsapp/wails/v2/internal/frontend/runtime" "github.com/wailsapp/wails/v2/internal/logger" "github.com/wailsapp/wails/v2/internal/menumanager" "github.com/wailsapp/wails/v2/pkg/options" ) func (a *App) Run() error { err := a.frontend.Run(a.ctx) a.frontend.RunMainLoop() a.frontend.WindowClose() if a.shutdownCallback != nil { a.shutdownCallback(a.ctx) } return err } // CreateApp creates the app! func CreateApp(appoptions *options.App) (*App, error) { var err error ctx := context.Background() // Merge default options options.MergeDefaults(appoptions) debug := IsDebug() devtools := IsDevtoolsEnabled() ctx = context.WithValue(ctx, "debug", debug) ctx = context.WithValue(ctx, "devtools", devtools) // Set up logger myLogger := logger.New(appoptions.Logger) if IsDebug() { myLogger.SetLogLevel(appoptions.LogLevel) } else { myLogger.SetLogLevel(appoptions.LogLevelProduction) } ctx = context.WithValue(ctx, "logger", myLogger) ctx = context.WithValue(ctx, "obfuscated", IsObfuscated()) // Preflight Checks err = PreflightChecks(appoptions, myLogger) if err != nil { return nil, err } // Create the menu manager menuManager := menumanager.NewManager() // Process the application menu if appoptions.Menu != nil { err = menuManager.SetApplicationMenu(appoptions.Menu) if err != nil { return nil, err } } // Create binding exemptions - Ugly hack. There must be a better way bindingExemptions := []interface{}{ appoptions.OnStartup, appoptions.OnShutdown, appoptions.OnDomReady, appoptions.OnBeforeClose, } appBindings := binding.NewBindings(myLogger, appoptions.Bind, bindingExemptions, IsObfuscated()) eventHandler := runtime.NewEvents(myLogger) ctx = context.WithValue(ctx, "events", eventHandler) // Attach logger to context if debug { ctx = context.WithValue(ctx, "buildtype", "debug") } else { ctx = context.WithValue(ctx, "buildtype", "production") } messageDispatcher := dispatcher.NewDispatcher(ctx, myLogger, appBindings, eventHandler) appFrontend := desktop.NewFrontend(ctx, appoptions, myLogger, appBindings, messageDispatcher) eventHandler.AddFrontend(appFrontend) ctx = context.WithValue(ctx, "frontend", appFrontend) result := &App{ ctx: ctx, frontend: appFrontend, logger: myLogger, menuManager: menuManager, startupCallback: appoptions.OnStartup, shutdownCallback: appoptions.OnShutdown, debug: debug, devtools: devtools, options: appoptions, } return result, nil }