mirror of
https://blitiri.com.ar/repos/chasquid
synced 2025-12-18 14:47:03 +00:00
protoio: I/O helpers for protobuf messages
This commit is contained in:
48
internal/protoio/protoio.go
Normal file
48
internal/protoio/protoio.go
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
// Package protoio contains I/O functions for protocol buffers.
|
||||||
|
package protoio
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"blitiri.com.ar/go/chasquid/internal/safeio"
|
||||||
|
|
||||||
|
"github.com/golang/protobuf/proto"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ReadMessage reads a protocol buffer message from fname, and unmarshalls it
|
||||||
|
// into pb.
|
||||||
|
func ReadMessage(fname string, pb proto.Message) error {
|
||||||
|
in, err := ioutil.ReadFile(fname)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return proto.Unmarshal(in, pb)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReadTextMessage reads a text format protocol buffer message from fname, and
|
||||||
|
// unmarshalls it into pb.
|
||||||
|
func ReadTextMessage(fname string, pb proto.Message) error {
|
||||||
|
in, err := ioutil.ReadFile(fname)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return proto.UnmarshalText(string(in), pb)
|
||||||
|
}
|
||||||
|
|
||||||
|
// WriteMessage marshals pb and atomically writes it into fname.
|
||||||
|
func WriteMessage(fname string, pb proto.Message, perm os.FileMode) error {
|
||||||
|
out, err := proto.Marshal(pb)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return safeio.WriteFile(fname, out, perm)
|
||||||
|
}
|
||||||
|
|
||||||
|
// WriteTextMessage marshals pb in text format and atomically writes it into
|
||||||
|
// fname.
|
||||||
|
func WriteTextMessage(fname string, pb proto.Message, perm os.FileMode) error {
|
||||||
|
out := proto.MarshalTextString(pb)
|
||||||
|
return safeio.WriteFile(fname, []byte(out), perm)
|
||||||
|
}
|
||||||
67
internal/protoio/protoio_test.go
Normal file
67
internal/protoio/protoio_test.go
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
package protoio
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"blitiri.com.ar/go/chasquid/internal/protoio/testpb"
|
||||||
|
)
|
||||||
|
|
||||||
|
func mustTempDir(t *testing.T) string {
|
||||||
|
dir, err := ioutil.TempDir("", "safeio_test")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = os.Chdir(dir)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Logf("test directory: %q", dir)
|
||||||
|
|
||||||
|
return dir
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestBin(t *testing.T) {
|
||||||
|
dir := mustTempDir(t)
|
||||||
|
pb := &testpb.M{"hola"}
|
||||||
|
|
||||||
|
if err := WriteMessage("f", pb, 0600); err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
pb2 := &testpb.M{}
|
||||||
|
if err := ReadMessage("f", pb2); err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
if pb.Content != pb2.Content {
|
||||||
|
t.Errorf("content mismatch, got %q, expected %q", pb2.Content, pb.Content)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !t.Failed() {
|
||||||
|
os.RemoveAll(dir)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestText(t *testing.T) {
|
||||||
|
dir := mustTempDir(t)
|
||||||
|
pb := &testpb.M{"hola"}
|
||||||
|
|
||||||
|
if err := WriteTextMessage("f", pb, 0600); err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
pb2 := &testpb.M{}
|
||||||
|
if err := ReadTextMessage("f", pb2); err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
if pb.Content != pb2.Content {
|
||||||
|
t.Errorf("content mismatch, got %q, expected %q", pb2.Content, pb.Content)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !t.Failed() {
|
||||||
|
os.RemoveAll(dir)
|
||||||
|
}
|
||||||
|
}
|
||||||
3
internal/protoio/testpb/dummy.go
Normal file
3
internal/protoio/testpb/dummy.go
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
package testpb
|
||||||
|
|
||||||
|
//go:generate protoc --go_out=. testpb.proto
|
||||||
53
internal/protoio/testpb/testpb.pb.go
Normal file
53
internal/protoio/testpb/testpb.pb.go
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
// Code generated by protoc-gen-go.
|
||||||
|
// source: testpb.proto
|
||||||
|
// DO NOT EDIT!
|
||||||
|
|
||||||
|
/*
|
||||||
|
Package testpb is a generated protocol buffer package.
|
||||||
|
|
||||||
|
It is generated from these files:
|
||||||
|
testpb.proto
|
||||||
|
|
||||||
|
It has these top-level messages:
|
||||||
|
M
|
||||||
|
*/
|
||||||
|
package testpb
|
||||||
|
|
||||||
|
import proto "github.com/golang/protobuf/proto"
|
||||||
|
import fmt "fmt"
|
||||||
|
import math "math"
|
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ = proto.Marshal
|
||||||
|
var _ = fmt.Errorf
|
||||||
|
var _ = math.Inf
|
||||||
|
|
||||||
|
// This is a compile-time assertion to ensure that this generated file
|
||||||
|
// is compatible with the proto package it is being compiled against.
|
||||||
|
// A compilation error at this line likely means your copy of the
|
||||||
|
// proto package needs to be updated.
|
||||||
|
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
|
||||||
|
|
||||||
|
type M struct {
|
||||||
|
Content string `protobuf:"bytes,1,opt,name=content" json:"content,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *M) Reset() { *m = M{} }
|
||||||
|
func (m *M) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*M) ProtoMessage() {}
|
||||||
|
func (*M) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
proto.RegisterType((*M)(nil), "testpb.M")
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() { proto.RegisterFile("testpb.proto", fileDescriptor0) }
|
||||||
|
|
||||||
|
var fileDescriptor0 = []byte{
|
||||||
|
// 69 bytes of a gzipped FileDescriptorProto
|
||||||
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0xe2, 0x29, 0x49, 0x2d, 0x2e,
|
||||||
|
0x29, 0x48, 0xd2, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x83, 0xf0, 0x94, 0x44, 0xb8, 0x18,
|
||||||
|
0x7d, 0x85, 0xf8, 0xb9, 0xd8, 0x93, 0xf3, 0xf3, 0x4a, 0x52, 0xf3, 0x4a, 0x24, 0x18, 0x15, 0x18,
|
||||||
|
0x35, 0x38, 0x93, 0xd8, 0xc0, 0x8a, 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xa9, 0x18, 0x08,
|
||||||
|
0x20, 0x34, 0x00, 0x00, 0x00,
|
||||||
|
}
|
||||||
8
internal/protoio/testpb/testpb.proto
Normal file
8
internal/protoio/testpb/testpb.proto
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
|
||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package testpb;
|
||||||
|
|
||||||
|
message M {
|
||||||
|
string content = 1;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user