main.mx raw

   1  package main
   2  
   3  import (
   4  	"bytes"
   5  	"fmt"
   6  	"os"
   7  )
   8  
   9  func getArgs() []string {
  10  	data, err := os.ReadFile("/proc/self/cmdline")
  11  	if err != nil || int32(len(data)) == 0 {
  12  		return nil
  13  	}
  14  	if data[int32(len(data))-1] == 0 {
  15  		data = data[:int32(len(data))-1]
  16  	}
  17  	parts := bytes.Split(data, "\x00")
  18  	args := []string{:0:int32(len(parts))}
  19  	for _, p := range parts {
  20  		args = append(args, string(p))
  21  	}
  22  	return args
  23  }
  24  
  25  func main() {
  26  	args := getArgs()
  27  	if int32(len(args)) < 2 {
  28  		fmt.Fprintln(os.Stderr(), "usage: moxieport <file.go> [file2.go ...]")
  29  		os.Exit(1)
  30  	}
  31  
  32  	errs := int32(0)
  33  	for i := int32(1); i < int32(len(args)); i++ {
  34  		if !processFile(args[i]) {
  35  			errs++
  36  		}
  37  	}
  38  	if errs > 0 {
  39  		os.Exit(1)
  40  	}
  41  }
  42  
  43  func processFile(path string) bool {
  44  	f, err := ParseFile(path, func(e error) {
  45  		fmt.Fprintf(os.Stderr(), "%s: %v\n", path, e)
  46  	}, nil, 0)
  47  	if err != nil {
  48  		return false
  49  	}
  50  	if f == nil {
  51  		fmt.Fprintf(os.Stderr(), "%s: parse returned nil\n", path)
  52  		return false
  53  	}
  54  
  55  	transformAll(f)
  56  
  57  	outPath := outputPath(path)
  58  	out, err := os.Create(outPath)
  59  	if err != nil {
  60  		fmt.Fprintf(os.Stderr(), "%s: %v\n", outPath, err)
  61  		return false
  62  	}
  63  
  64  	printFile(out, f)
  65  	out.Close()
  66  
  67  	report(os.Stderr(), outPath, f)
  68  
  69  	fmt.Fprintf(os.Stderr(), "%s -> %s\n", path, outPath)
  70  	return true
  71  }
  72  
  73  func outputPath(path string) string {
  74  	if bytes.HasSuffix(path, ".go") {
  75  		return path[:int32(len(path))-3] | ".mx"
  76  	}
  77  	return path | ".mx"
  78  }
  79