kittenipc/kitcom/main.go
2025-10-21 10:50:42 +03:00

146 lines
2.6 KiB
Go

package main
import (
"flag"
"fmt"
"log"
"os"
"path"
"path/filepath"
)
var (
Src string
Dest string
)
func parseFlags() {
flag.StringVar(&Src, "src", "", "Source file")
flag.StringVar(&Dest, "dest", "", "Dest file")
flag.Parse()
}
type ValType int
// todo check TInt size < 64
// todo check not float
const (
TInt ValType = 1
TString ValType = 2
TBool ValType = 3
TBlob ValType = 4
TArray ValType = 5
)
type Val struct {
Name string
Type ValType
Children []Val
}
type Method struct {
Name string
Pars []Val
Ret []Val
}
type Api struct {
Methods []Method
}
type ApiParser interface {
Parse(sourceFile string) (*Api, error)
}
type ApiGenerator interface {
Generate(api *Api, destFile string) error
}
func main() {
// todo support go:generate
//goFile := os.Getenv("GOFILE")
//if goFile == "" {
// log.Panic("GOFILE must be set")
//}
parseFlags()
if Src == "" || Dest == "" {
log.Panic("source and destination must be set")
}
srcAbs, err := filepath.Abs(Src)
if err != nil {
log.Panic(err)
}
destAbs, err := filepath.Abs(Dest)
if err != nil {
log.Panic(err)
}
if err := checkIsFile(srcAbs); err != nil {
log.Panic(err)
}
apiParser, err := apiParserByExt(srcAbs)
if err != nil {
log.Panic(err)
}
api, err := apiParser.Parse(srcAbs)
if err != nil {
log.Panic(err)
}
apiGenerator, err := apiGeneratorByExt(destAbs)
if err != nil {
log.Panic(err)
}
if err := apiGenerator.Generate(api, destAbs); err != nil {
log.Panic(err)
}
}
func checkIsFile(src string) error {
info, err := os.Stat(src)
if err != nil {
return fmt.Errorf("stat file: %w", err)
}
if info.IsDir() {
return fmt.Errorf("%s is a directory; directories are not supported yet", src)
}
return nil
}
func apiParserByExt(src string) (ApiParser, error) {
switch path.Ext(src) {
case ".go":
return &GoApiParser{}, nil
case ".ts":
return &TypescriptApiParser{}, nil
case ".js":
return nil, fmt.Errorf("vanilla javascript is not supported and never will be")
case "":
return nil, fmt.Errorf("could not find file extension for %s", src)
default:
return nil, fmt.Errorf("unsupported file extension: %s", path.Ext(src))
}
}
func apiGeneratorByExt(dest string) (ApiGenerator, error) {
switch path.Ext(dest) {
case ".go":
return &GoApiGenerator{}, nil
case ".ts":
return &TypescriptApiGenerator{}, nil
case ".js":
return nil, fmt.Errorf("vanilla javascript is not supported and never will be")
case "":
return nil, fmt.Errorf("could not find file extension for %s", dest)
default:
return nil, fmt.Errorf("unsupported file extension: %s", path.Ext(dest))
}
}