rpcgen: JSON-RPC 2.0 Client Generator Implementation for zenrpc

rpcgen
is a JSON-RPC 2.0 client library generator for zenrpc. It supports client generation for following languages:
Examples
Basic usage
package main
import (
"fmt"
"log"
"net/http"
"github.com/semrush/zenrpc/v2"
"github.com/vmkteam/rpcgen"
)
func main() {
rpc := zenrpc.NewServer(zenrpc.Options{})
generated, err := rpcgen.FromSMD(rpc.SMD()).GoClient().Generate()
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s", generated)
}
Generate in HTTP handler
package main
import (
"net/http"
"github.com/semrush/zenrpc/v2"
"github.com/vmkteam/rpcgen"
)
func main () {
rpc := zenrpc.NewServer(zenrpc.Options{})
gen := rpcgen.FromSMD(rpc.SMD())
http.HandleFunc("/client.go", rpcgen.Handler(gen.GoClient()))
http.HandleFunc("/client.ts", rpcgen.Handler(gen.TSClient(nil)))
}
Add custom TypeScript type mapper
package main
import (
"net/http"
"github.com/semrush/zenrpc/v2"
"github.com/semrush/zenrpc/v2/smd"
"github.com/vmkteam/rpcgen"
"github.com/vmkteam/rpcgen/typescript"
)
func main() {
rpc := zenrpc.NewServer(zenrpc.Options{})
gen := rpcgen.FromSMD(rpc.SMD())
typeMapper := func(in smd.JSONSchema, tsType typescript.Type) typescript.Type {
if in.Type == "object" {
if in.Description == "Group" && in.Name == "groups" {
tsType.Type = fmt.Sprintf("Record<number, I%s>", in.Description)
}
}
return tsType
}
http.HandleFunc("/client.ts", rpcgen.Handler(gen.TSClient(typeMapper)))
}