Categorygithub.com/reddec/jsonrpc2
repositorypackage
0.1.21
Repository: https://github.com/reddec/jsonrpc2.git
Documentation: pkg.go.dev

# Packages

No description provided by the author
No description provided by the author
No description provided by the author

# README

JSON-RPC 2 Go supporting library

Documentation license donate Download

The library aims to bring JSON-RPC 2.0 support to Go. Goals:

  • Type safe by code-generation
  • Reasonable good performance
  • Clean, extendable and easy-to use interface
  • Protocol-agnostic solution with adapters for common-cases (HTTP, TCP, etc...)

Installation

  • (recommended) look at releases page and download
  • build from source go get -v github.com/reddec/jsonrpc2/cmd/...
  • From bintray repository for most debian-based distribution (trusty, xenial, bionic, buster, wheezy):
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 379CE192D401AB61
echo "deb https://dl.bintray.com/reddec/debian {distribution} main" | sudo tee -a /etc/apt/sources.list
sudo apt install jsonrpc2

Build requirements

  • go 1.13+

Usage as library

Please see package documentation

Usage as CLI for type-safe generation

Usage:
  jsonrpc2-gen [OPTIONS]

Generate tiny wrapper for JSON-RPC router
Author: Baryshnikov Aleksandr <[email protected]>
Version: dev

Application Options:
  -i, --file=                                File to scan [$GOFILE]
  -I, --interface=                           Interface to wrap [$INTERFACE]
      --namespace=                           Custom namespace for functions. If not defined - interface name will be used [$NAMESPACE]
  -w, --wrapper=                             Wrapper function name. If not defined - Register<interface> name will be used [$WRAPPER]
  -o, --output=                              Generated output destination (- means STDOUT) (default: -) [$OUTPUT]
  -p, --package=                             Package name (can be override by output dir) (default: events) [$PACKAGE]
  -d, --doc=                                 Generate markdown documentation [$DOC]
  -c, --case=[keep|camel|pascal|snake|kebab] Method name case style (default: keep) [$CASE]
      --url=                                 URL for examples in documentation (default: https://example.com/api) [$URL]
  -C, --interceptor                          add interceptor for each method [$INTERCEPTOR]

Help Options:
  -h, --help                                 Show this help message

Example

Assume you have an interface file (user.go) like this:

package abc

// General user profile access
type User interface {
	// Get user profile
	Profile(token string) (*Profile, error)
}

Just invoke jsonrpc2-gen -i user.go -o user_gen.go -I User -p abc

You will get user_gen.go file like that:

// Code generated by jsonrpc2-gen. DO NOT EDIT.
//go:generate jsonrpc2-gen -i user.go -o user_gen.go -I User -p abc
package abc

import (
	"encoding/json"
	jsonrpc2 "github.com/reddec/jsonrpc2"
)

func RegisterUser(router *jsonrpc2.Router, wrap User) []string {
	router.RegisterFunc("User.Profile", func(params json.RawMessage, positional bool) (interface{}, error) {
		var args struct {
			Arg0 string `json:"token"`
		}
		var err error
		if positional {
			err = jsonrpc2.UnmarshalArray(params, &args.Arg0)
		} else {
			err = json.Unmarshal(params, &args)
		}
		if err != nil {
			return nil, err
		}
		return wrap.Profile(args.Arg0)
	})

	return []string{"User.Profile"}
}

Generate documentation

Add -doc user.md to generate documentations as described bellow. It will be generated and saved to the provided file (user.md)

# User

General user profile access


## User.Profile

Get user profile

* Method: `User.Profile`
* Returns: `*Profile`
* Arguments:

| Position | Name | Type |
|----------|------|------|
| 0 | token | `string` |

KTOR (kotlin) generator

  • Supports time/Time
  • (TBD) time/Duration

Gradle requirements


def ktor_version = '1.3.1'

repositories {
    mavenCentral()
}

dependencies {
    implementation("io.ktor:ktor-client-cio:$ktor_version") // <-- you can choose another
    implementation("io.ktor:ktor-client-gson:$ktor_version")
}