//go:build ignore

package main

import (
	"fmt"
	"os"
	"runtime"

	ccgo "modernc.org/ccgo/v4/lib"
)

func main() {
	if ccgo.IsExecEnv() {
		goarch := os.Getenv("TARGET_GOARCH")
		goos := os.Getenv("TARGET_GOOS")
		if goarch == "" {
			goarch = runtime.GOARCH
		}
		if goos == "" {
			goos = runtime.GOOS
		}
		if err := ccgo.NewTask(goos, goarch, os.Args,
			os.Stdout, os.Stderr, nil).Main(); err != nil {
			fmt.Fprintln(os.Stderr, err)
		}
		return
	}

	treeSitterDir := os.Getenv("HOME") + "/src/github.com/tree-sitter/tree-sitter/lib"

	goos := runtime.GOOS
	goarch := runtime.GOARCH

	config := []string{
		os.Args[0],
		"--package-name", "treesitter",
		"-o", "tree-sitter.go",

		// 前缀映射
		"--prefix-external", "X",
		"--prefix-field", "F",
		"--prefix-static-internal", "_",
		"--prefix-static-none", "_",
		"--prefix-typename", "T",
		"--prefix-tagged-struct", "T",
		"--prefix-tagged-union", "T",
		"--prefix-enumerator", "_",
		"--prefix-undefined", "_",

		// 编译选项
		"-std=c11",
		"-D_POSIX_C_SOURCE=200112L",
		"-D__TINYC__",
		"-Dinline=",
		"-I", treeSitterDir + "/src",
		"-I", treeSitterDir + "/include",

		// 错误容忍
		"-ignore-unsupported-alignment",
		"-extended-errors",

		// 输入
		treeSitterDir + "/src/lib.c",
	}

	if err := ccgo.NewTask(goos, goarch, config,
		os.Stdout, os.Stderr, nil).Main(); err != nil {
		fmt.Fprintf(os.Stderr, "ccgo: %v\n", err)
		os.Exit(1)
	}
}