github.com/AlpineAIO/wails/v2@v2.0.0-beta.32.0.20240505041856-1047a8fa5fef/internal/app/app_bindings.go (about)

     1  //go:build bindings
     2  
     3  package app
     4  
     5  import (
     6  	"flag"
     7  	"os"
     8  	"path/filepath"
     9  
    10  	"github.com/AlpineAIO/wails/v2/internal/binding"
    11  	"github.com/AlpineAIO/wails/v2/internal/frontend/runtime/wrapper"
    12  	"github.com/AlpineAIO/wails/v2/internal/fs"
    13  	"github.com/AlpineAIO/wails/v2/internal/logger"
    14  	"github.com/AlpineAIO/wails/v2/internal/project"
    15  	"github.com/AlpineAIO/wails/v2/pkg/options"
    16  	"github.com/leaanthony/gosod"
    17  )
    18  
    19  func (a *App) Run() error {
    20  
    21  	// Create binding exemptions - Ugly hack. There must be a better way
    22  	bindingExemptions := []interface{}{
    23  		a.options.OnStartup,
    24  		a.options.OnShutdown,
    25  		a.options.OnDomReady,
    26  		a.options.OnBeforeClose,
    27  	}
    28  
    29  	// Check for CLI Flags
    30  	bindingFlags := flag.NewFlagSet("bindings", flag.ContinueOnError)
    31  
    32  	var tsPrefixFlag *string
    33  	var tsPostfixFlag *string
    34  	var tsOutputTypeFlag *string
    35  
    36  	tsPrefix := os.Getenv("tsprefix")
    37  	if tsPrefix == "" {
    38  		tsPrefixFlag = bindingFlags.String("tsprefix", "", "Prefix for generated typescript entities")
    39  	}
    40  
    41  	tsSuffix := os.Getenv("tssuffix")
    42  	if tsSuffix == "" {
    43  		tsPostfixFlag = bindingFlags.String("tssuffix", "", "Suffix for generated typescript entities")
    44  	}
    45  
    46  	tsOutputType := os.Getenv("tsoutputtype")
    47  	if tsOutputType == "" {
    48  		tsOutputTypeFlag = bindingFlags.String("tsoutputtype", "", "Output type for generated typescript entities (classes|interfaces)")
    49  	}
    50  
    51  	_ = bindingFlags.Parse(os.Args[1:])
    52  	if tsPrefixFlag != nil {
    53  		tsPrefix = *tsPrefixFlag
    54  	}
    55  	if tsPostfixFlag != nil {
    56  		tsSuffix = *tsPostfixFlag
    57  	}
    58  	if tsOutputTypeFlag != nil {
    59  		tsOutputType = *tsOutputTypeFlag
    60  	}
    61  
    62  	appBindings := binding.NewBindings(a.logger, a.options.Bind, bindingExemptions, IsObfuscated(), a.options.EnumBind)
    63  
    64  	appBindings.SetTsPrefix(tsPrefix)
    65  	appBindings.SetTsSuffix(tsSuffix)
    66  	appBindings.SetOutputType(tsOutputType)
    67  
    68  	err := generateBindings(appBindings)
    69  	if err != nil {
    70  		return err
    71  	}
    72  	return nil
    73  }
    74  
    75  // CreateApp creates the app!
    76  func CreateApp(appoptions *options.App) (*App, error) {
    77  	// Set up logger
    78  	myLogger := logger.New(appoptions.Logger)
    79  	myLogger.SetLogLevel(appoptions.LogLevel)
    80  
    81  	result := &App{
    82  		logger:  myLogger,
    83  		options: appoptions,
    84  	}
    85  
    86  	return result, nil
    87  
    88  }
    89  
    90  func generateBindings(bindings *binding.Bindings) error {
    91  
    92  	cwd, err := os.Getwd()
    93  	if err != nil {
    94  		return err
    95  	}
    96  	projectConfig, err := project.Load(cwd)
    97  	if err != nil {
    98  		return err
    99  	}
   100  
   101  	wailsjsbasedir := filepath.Join(projectConfig.GetWailsJSDir(), "wailsjs")
   102  
   103  	runtimeDir := filepath.Join(wailsjsbasedir, "runtime")
   104  	_ = os.RemoveAll(runtimeDir)
   105  	extractor := gosod.New(wrapper.RuntimeWrapper)
   106  	err = extractor.Extract(runtimeDir, nil)
   107  	if err != nil {
   108  		return err
   109  	}
   110  
   111  	goBindingsDir := filepath.Join(wailsjsbasedir, "go")
   112  	err = os.RemoveAll(goBindingsDir)
   113  	if err != nil {
   114  		return err
   115  	}
   116  	_ = fs.MkDirs(goBindingsDir)
   117  
   118  	err = bindings.GenerateGoBindings(goBindingsDir)
   119  	if err != nil {
   120  		return err
   121  	}
   122  
   123  	return fs.SetPermissions(wailsjsbasedir, 0755)
   124  }