func main()

in runtime/go/v1.20/lib/launcher.go [35:141]


func main() {
	// check if the execution environment is correct
	if OwExecutionEnv != "" && OwExecutionEnv != os.Getenv("__OW_EXECUTION_ENV") {
		fmt.Println("Execution Environment Mismatch")
		fmt.Println("Expected: ", OwExecutionEnv)
		fmt.Println("Actual: ", os.Getenv("__OW_EXECUTION_ENV"))
		os.Exit(1)
	}

	// debugging
	var debug = os.Getenv("OW_DEBUG") != ""
	if debug {
		f, err := os.OpenFile("/tmp/action.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
		if err == nil {
			log.SetOutput(f)
		}
		log.Printf("Environment: %v", os.Environ())
	}

	resultKind := reflect.TypeOf(Main).Out(0).Kind()
	if resultKind != reflect.Map && resultKind != reflect.Slice && resultKind != reflect.Array {
		fmt.Println("Support map and slice and array only")
		os.Exit(1)
	}

	// input
	out := os.NewFile(3, "pipe")
	defer out.Close()
	reader := bufio.NewReader(os.Stdin)

	// acknowledgement of started action
	fmt.Fprintf(out, `{ "ok": true}%s`, "\n")
	if debug {
		log.Println("action started")
	}

	// read-eval-print loop
	for {
		// read one line
		inbuf, err := reader.ReadBytes('\n')
		if err != nil {
			if err != io.EOF {
				log.Println(err)
			}
			break
		}
		if debug {
			log.Printf(">>>'%s'>>>", inbuf)
		}
		// parse one line
		var input map[string]interface{}
		err = json.Unmarshal(inbuf, &input)
		if err != nil {
			log.Println(err.Error())
			fmt.Fprintf(out, "{ error: %q}\n", err.Error())
			continue
		}
		if debug {
			log.Printf("%v\n", input)
		}
		// set environment variables
		for k, v := range input {
			if k == "value" {
				continue
			}
			if s, ok := v.(string); ok {
				os.Setenv("__OW_"+strings.ToUpper(k), s)
			}
		}
		// get payload if not empty
		isJsonObjectParam := true
		var payloadForJsonObject map[string]interface{}
		var payloadForJsonArray []interface{}
		if value, ok := input["value"].(map[string]interface{}); ok {
			payloadForJsonObject = value
		} else {
			if value, ok := input["value"].([]interface{}); ok {
				payloadForJsonArray = value
				isJsonObjectParam = false
			}
		}
		// process the request
		var result interface{}
		funcMain := reflect.ValueOf(Main)
		if isJsonObjectParam {
			param := []reflect.Value{reflect.ValueOf(payloadForJsonObject)}
			reflectResult := funcMain.Call(param)
			result = reflectResult[0].Interface()
		} else {
			param := []reflect.Value{reflect.ValueOf(payloadForJsonArray)}
			reflectResult := funcMain.Call(param)
			result = reflectResult[0].Interface()
		}
		// encode the answer
		output, err := json.Marshal(&result)
		if err != nil {
			log.Println(err.Error())
			fmt.Fprintf(out, "{ error: %q}\n", err.Error())
			continue
		}
		output = bytes.Replace(output, []byte("\n"), []byte(""), -1)
		if debug {
			log.Printf("<<<'%s'<<<", output)
		}
		fmt.Fprintf(out, "%s\n", output)
	}
}