Go to file
2022-12-13 13:38:47 +00:00
test test: adds integration test 2022-12-13 13:12:51 +00:00
vendor test: adds integration test 2022-12-13 13:12:51 +00:00
.gitlab-ci.yml first commit 2022-12-12 11:33:48 +00:00
Earthfile test: adds integration test 2022-12-13 13:12:51 +00:00
go.mod test: adds integration test 2022-12-13 13:12:51 +00:00
go.sum test: adds integration test 2022-12-13 13:12:51 +00:00
integration_test.go test: adds integration test 2022-12-13 13:12:51 +00:00
main.go feat: ability to exclude messages 2022-12-13 13:12:42 +00:00
README.gif docs: adds readme 2022-12-13 13:34:46 +00:00
README.md docs: formatting 2022-12-13 13:38:47 +00:00

protoc-gen-go-value-scan

Implements scanner and valuer interfaces for proto messages.

README

What it does

Takes this proto

syntax = "proto3";

package foo.v1;

option go_package = "git.wobcom.de/smartmetering/protoc-gen-go-value-scan/test/go/foo/v1;foov1";

message Foo {
    string bar  = 1;
    string zonk = 2;
}

message ExcludeThis {
    string bar  = 1;
    string zonk = 2;
}

and creates this go code

// Code generated by protoc-gen-go-value-scan. DO NOT EDIT.

package foov1

import (
	"database/sql/driver"
	"fmt"

	protojson "google.golang.org/protobuf/encoding/protojson"
)

func (x Foo) Value() (driver.Value, error) {
	f := &x

	opts := protojson.MarshalOptions{}
	opts.UseProtoNames = false
	opts.EmitUnpopulated = true

	return opts.Marshal(f)
}

func (x *Foo) Scan(value interface{}) error {
	switch v := value.(type) {
	case []byte:
		return protojson.Unmarshal(v, x)
	case string:
		return protojson.Unmarshal([]byte(v), x)
	default:
		return fmt.Errorf("type assertion failed")
	}
}

with this buf.gen.yaml

version: v1
plugins:
  - name: go
    out: go/
    opt:
      - paths=source_relative
  - name: go-value-scan
    out: go/
    opt:
      - paths=source_relative,use_proto_names=false,emit_unpopulated=true,exclude=git.wobcom.de/smartmetering/protoc-gen-go-value-scan/test/go/foo/v1.ExcludeThis

Configuration

Option Meaning Default
use_proto_names UseProtoNames uses proto field name instead of lowerCamelCase name in JSON field names true
emit_unpopulated EmitUnpopulated specifies whether to emit unpopulated fields true
exclude Takes a message identifier. Can be multiple identifier delimited by , none