ランキングに戻る

hexdigest/gowrap

Go

GoWrap is a command line tool for generating decorators for Go interfaces

golang-toolsgolanggocode-generationinterfaceinterfacesdecoratorsprometheusprometheus-metricslogrusfallback
スター成長
スター
1.3k
フォーク
94
週間成長
Issue
12
5001k
2018年10月2021年5月2023年12月2026年7月
成果物Go Modulesgo get github.com/hexdigest/gowrap
README

GoWrap

License Build Coverage Status Go Report Card GoDoc Awesome Release

GoWrap is a command line tool that generates decorators for Go interface types using simple templates. With GoWrap you can easily add metrics, tracing, fallbacks, pools, and many other features into your existing code in a few seconds.

Demo

demo

Installation

CLI

go install github.com/hexdigest/gowrap/cmd/gowrap@latest

As module

go get -u github.com/hexdigest/gowrap/cmd/gowrap

Usage of gowrap

Usage: gowrap gen -p package -i interfaceName -t template -o output_file.go
  -g	don't put //go:generate instruction into the generated code
  -i string
    	the source interface name, i.e. "Reader"
  -o string
    	the output file name
  -p string
    	the source package import path, i.e. "io", "github.com/hexdigest/gowrap" or
    	a relative import path like "./generator"
  -t template
    	the template to use, it can be an HTTPS URL a local file or a
    	reference to one of the templates in the gowrap repository
  -v value
    	a key-value pair to parametrize the template,
    	arguments without an equal sign are treated as a bool values,
    	i.e. -v DecoratorName=MyDecorator -v disableChecks

This will generate an implementation of the io.Reader interface wrapped with prometheus metrics

  $ gowrap gen -p io -i Reader -t prometheus -o reader_with_metrics.go

This will generate a fallback decorator for the Connector interface that can be found in the ./connector subpackage:

  $ gowrap gen -p ./connector -i Connector -t fallback -o ./connector/with_metrics.go

Run gowrap help for more options

Hosted templates

When you specify a template with the "-t" flag, gowrap will first search for and use the local file with this name. If the file is not found, gowrap will look for the template here and use it if found.

List of available templates:

  • circuitbreaker stops executing methods of the wrapped interface after the specified number of consecutive errors and resumes execution after the specified delay
  • fallback takes several implementations of the source interface and concurrently runs each implementation if the previous attempt didn't return the result in a specified period of time, it returns the first non-error result
  • log instruments the source interface with logging using standard logger from the "log" package
  • logrus instruments the source interface with logging using popular sirupsen/logrus logger
  • opencensus instruments the source interface with opencensus spans
  • opentelemetry instruments the source interface with opentelemetry spans
  • opentracing instruments the source interface with opentracing spans
  • prometheus instruments the source interface with prometheus metrics
  • ratelimit instruments the source interface with RPS limit and concurrent calls limit
  • retry instruments the source interface with retries
  • robinpool puts several implementations of the source interface to the slice and for every method call it picks one implementation from the slice using the Round-robin algorithm
  • syncpool puts several implementations of the source interface to the sync.Pool and for every method call it gets one implementation from the pool and puts it back once finished
  • timeout instruments each method that accepts context with configurable timeout
  • validate runs func Validate() error method on each argument if it's present
  • twirp_error inject request data into twirp.Error as metadata
  • twirp_validate runs func Validate() error method on each argument if it's present and wraps returned error with twirp.Malformed error
  • grpc_validate runs func Validate() error method on each argument if it's present and returns InvalidArgument error in case when validation failed
  • elastic apm instruments the source interface with elastic apm spans
  • caching instruments the source interface with in-memory caching using go-cache library

By default GoWrap places the //go:generate instruction into the generated code. This allows you to regenerate decorators' code just by typing go generate ./... when you change the source interface type declaration. However if you used a remote template, the //go:generate instruction will contain the HTTPS URL of the template and therefore you will need to have internet connection in order to regenerate decorators. In order to avoid this, you can copy templates from the GoWrap repository to local files and add them to your version control system:

$ gowrap template copy fallback templates/fallback

The above command will fetch the fallback template and copy it to the templates/fallback local file. After template is copied, you can generate decorators using this local template:

$ gowrap gen -p io -i Reader -t templates/fallback reader_with_fallback.go

Custom templates

You can always write your own template that will provide the desired functionality to your interfaces. If you think that your template might be useful to others, please consider adding it to our template repository.

The structure of information passed to templates is documented with the TemplateInputs struct.

Template Functions

In the templates, all functions provided by the sprig template library are available.

Additionally gowrap includes the following template functions:

  • up: returns the input with all Unicode letters mapped to their upper case.
  • down: returns the input with all Unicode letters mapped to their lower case.
  • upFirst: returns the input with the first Unicode letter mapped to their upper case.
  • downFirst: returns the input with the first Unicode letter mapped to their lower case.
  • replace: returns the input with all occurences of the first argument replaced with the second argument.
  • snake: returns the input in snake case representation.

Become a patron

Here's my Patreon page. Thank you!

関連リポジトリ
ondrajz/go-callvis

Visualize call graph of a Go program using Graphviz

GoGo ModulesMIT Licensecallgraphgraphviz
ondrajz.github.io/go-callvis/
6.5k433
cweill/gotests

Automatically generate Go test boilerplate from your source code.

GoGo ModulesApache License 2.0golang-toolstesting
5.3k351
qax-os/goreporter

A Golang tool that does static analysis, unit testing, code review and generate code quality report.

GoGo ModulesApache License 2.0codereviewreporter
3.1k261
gojp/goreportcard

A report card for your Go application

GoGo ModulesApache License 2.0golanggolang-tools
goreportcard.com
2.2k298
zhzyker/dismap

Asset discovery and identification tools 快速识别 Web 指纹信息,定位资产类型。辅助红队快速定位目标资产信息,辅助蓝队发现疑似脆弱点

GoGo ModulesGNU General Public License v3.0identificationsecurity-tools
2.2k271
templui/templui

A growing collection of beautifully designed UI components for Go and templ. Install via CLI. Customize everything. Own your code.

templMIT Licensegogo-web
templui.io
1.6k92
xiecat/goblin

一款适用于红蓝对抗中的仿真钓鱼系统

GoGo ModulesGNU General Public License v3.0phishinghoneypots
goblin.xiecat.fun
1.5k200
x1unix/go-playground

Better Go Playground with autocompletion and syntax highlight

GoGo ModulesMIT Licensegolanggolang-package
goplay.tools
1.5k98
peterldowns/localias

custom local domain aliases for local dev servers

GoGo ModulesMIT Licenseclidevtools
1.4k16
DimitarPetrov/stegify

🔍 Go tool for LSB steganography, capable of hiding any file within an image.

GoGo ModulesMIT Licensegolangsteganography
1.3k120
gowebly/gowebly

🔥 A next-generation CLI tool that makes it easy to create amazing web applications with Go on the backend, using htmx, hyperscript or Alpine.js, and the most popular CSS frameworks on the frontend.

GoGo ModulesApache License 2.0cligo
gowebly.org
1.2k47
EddieIvan01/iox

Tool for port forwarding & intranet proxy

GoGo ModulesMIT Licenseintranetpentest
1.2k196