// 8 august 2018
// usage: hresultwrap funclist template out
package main

import (
	"fmt"
	"os"
	"io/ioutil"
	"text/template"
	"strings"

	"github.com/golang/protobuf/proto"
)

func argname(arg string) string {
	fields := strings.Fields(arg)
	last := fields[len(fields) - 1]
	start := strings.LastIndexFunc(last, func(r rune) bool {
		return !(r >= 'A' && r <= 'Z') &&
			!(r >= 'a' && r <= 'z') &&
			!(r >= '0' && r <= '9') &&
			r != '_'
	})
	if start == -1 {
		return last
	}
	// TODO replace + 1 with + len of that last rune
	return last[start + 1:]
}

func argcomma(n, len int) string {
	if n == len - 1 {
		return ""
	}
	return ", "
}

var templateFuncs = template.FuncMap{
	"argname":	argname,
	"argcomma":	argcomma,
}

func main() {
	if len(os.Args) != 3 {
		fmt.Fprintf(os.Stderr, "usage: %s funclist template\n", os.Args[0])
		os.Exit(1)
	}
	b, err := ioutil.ReadFile(os.Args[1])
	if err != nil {
		fmt.Fprintf(os.Stderr, "error reading %s: %v\n", os.Args[1], err)
		os.Exit(1)
	}
	var f File
	err = proto.UnmarshalText(string(b), &f)
	if err != nil {
		fmt.Fprintf(os.Stderr, "error parsing %s: %v\n", os.Args[1], err)
		os.Exit(1)
	}

	tmpl, err := template.New(os.Args[2]).Funcs(templateFuncs).ParseFiles(os.Args[2])
	if err != nil {
		fmt.Fprintf(os.Stderr, "error parsing %s: %v\n", os.Args[2], err)
		os.Exit(1)
	}
	err = tmpl.Execute(os.Stdout, f.Func)
	if err != nil {
		fmt.Fprintf(os.Stderr, "error executing template: %v\n", err)
		os.Exit(1)
	}
}