andrey1s
4 years ago
commit
d6e6001d6b
18 changed files with 348 additions and 0 deletions
@ -0,0 +1,13 @@ |
|||||
|
kind: pipeline |
||||
|
name: default |
||||
|
|
||||
|
steps: |
||||
|
- name: test |
||||
|
image: golang |
||||
|
commands: |
||||
|
- go test |
||||
|
|
||||
|
- name: golangci-lint |
||||
|
image: golangci/golangci-lint:v1.39 |
||||
|
commands: |
||||
|
- golangci-lint run |
@ -0,0 +1,17 @@ |
|||||
|
# ---> Go |
||||
|
# Binaries for programs and plugins |
||||
|
*.exe |
||||
|
*.exe~ |
||||
|
*.dll |
||||
|
*.so |
||||
|
*.dylib |
||||
|
|
||||
|
# Test binary, built with `go test -c` |
||||
|
*.test |
||||
|
|
||||
|
# Output of the go coverage tool, specifically when used with LiteIDE |
||||
|
*.out |
||||
|
|
||||
|
# Dependency directories (remove the comment below to include it) |
||||
|
# vendor/ |
||||
|
|
@ -0,0 +1,31 @@ |
|||||
|
linters-settings: |
||||
|
dupl: |
||||
|
threshold: 100 |
||||
|
funlen: |
||||
|
lines: 100 |
||||
|
statements: 50 |
||||
|
goconst: |
||||
|
min-len: 2 |
||||
|
min-occurrences: 2 |
||||
|
gocyclo: |
||||
|
min-complexity: 15 |
||||
|
golint: |
||||
|
min-confidence: 0 |
||||
|
govet: |
||||
|
check-shadowing: true |
||||
|
lll: |
||||
|
line-length: 140 |
||||
|
maligned: |
||||
|
suggest-new: true |
||||
|
misspell: |
||||
|
locale: US |
||||
|
|
||||
|
linters: |
||||
|
enable-all: true |
||||
|
|
||||
|
issues: |
||||
|
# Excluding configuration per-path, per-linter, per-text and per-source |
||||
|
exclude-rules: |
||||
|
- path: _test\.go |
||||
|
linters: |
||||
|
- gomnd |
@ -0,0 +1,19 @@ |
|||||
|
MIT License Copyright (c) 2020 4devs |
||||
|
|
||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy |
||||
|
of this software and associated documentation files (the "Software"), to deal |
||||
|
in the Software without restriction, including without limitation the rights |
||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
||||
|
copies of the Software, and to permit persons to whom the Software is furnished |
||||
|
to do so, subject to the following conditions: |
||||
|
|
||||
|
The above copyright notice and this permission notice (including the next |
||||
|
paragraph) shall be included in all copies or substantial portions of the |
||||
|
Software. |
||||
|
|
||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS |
||||
|
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS |
||||
|
OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
||||
|
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF |
||||
|
OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
@ -0,0 +1,5 @@ |
|||||
|
# encoding |
||||
|
|
||||
|
[![Build Status](https://drone.gitoa.ru/api/badges/go-4devs/encoding/status.svg)](https://drone.gitoa.ru/go-4devs/encoding) |
||||
|
[![Go Report Card](https://goreportcard.com/badge/gitoa.ru/go-4devs/encoding)](https://goreportcard.com/report/gitoa.ru/go-4devs/encoding) |
||||
|
[![GoDoc](https://godoc.org/gitoa.ru/go-4devs/encoding?status.svg)](http://godoc.org/gitoa.ru/go-4devs/encoding) |
@ -0,0 +1,11 @@ |
|||||
|
package encoding |
||||
|
|
||||
|
import ( |
||||
|
"io" |
||||
|
) |
||||
|
|
||||
|
// Encode writer from volume.
|
||||
|
type Encode func(w io.Writer, v interface{}) error |
||||
|
|
||||
|
// Decode reader to volume.
|
||||
|
type Decode func(r io.Reader, v interface{}) error |
@ -0,0 +1,9 @@ |
|||||
|
module gitoa.ru/go-4devs/encoding |
||||
|
|
||||
|
go 1.16 |
||||
|
|
||||
|
require ( |
||||
|
github.com/BurntSushi/toml v0.3.1 |
||||
|
github.com/stretchr/testify v1.7.0 |
||||
|
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b |
||||
|
) |
@ -0,0 +1,14 @@ |
|||||
|
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= |
||||
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= |
||||
|
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= |
||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= |
||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= |
||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= |
||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= |
||||
|
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= |
||||
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= |
||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= |
||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= |
||||
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= |
||||
|
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= |
||||
|
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= |
@ -0,0 +1,19 @@ |
|||||
|
package gob |
||||
|
|
||||
|
import ( |
||||
|
"encoding/gob" |
||||
|
"io" |
||||
|
|
||||
|
"gitoa.ru/go-4devs/encoding" |
||||
|
) |
||||
|
|
||||
|
var _ encoding.Decode = Decode |
||||
|
var _ encoding.Encode = Encode |
||||
|
|
||||
|
func Decode(r io.Reader, v interface{}) error { |
||||
|
return gob.NewDecoder(r).Decode(v) |
||||
|
} |
||||
|
|
||||
|
func Encode(w io.Writer, v interface{}) error { |
||||
|
return gob.NewEncoder(w).Encode(v) |
||||
|
} |
@ -0,0 +1,28 @@ |
|||||
|
package gob |
||||
|
|
||||
|
import ( |
||||
|
"bytes" |
||||
|
"encoding/gob" |
||||
|
|
||||
|
"gitoa.ru/go-4devs/encoding" |
||||
|
) |
||||
|
|
||||
|
var _ encoding.Unmarshal = Unmarshal |
||||
|
var _ encoding.Marshal = Marshal |
||||
|
|
||||
|
// Unmarshal by gob decoder.
|
||||
|
func Unmarshal(data []byte, v interface{}) error { |
||||
|
buf := bytes.NewBuffer(data) |
||||
|
|
||||
|
return gob.NewDecoder(buf).Decode(v) |
||||
|
} |
||||
|
|
||||
|
// Marshal by gob encoder.
|
||||
|
func Marshal(v interface{}) ([]byte, error) { |
||||
|
var data bytes.Buffer |
||||
|
if err := gob.NewEncoder(&data).Encode(v); err != nil { |
||||
|
return nil, err |
||||
|
} |
||||
|
|
||||
|
return data.Bytes(), nil |
||||
|
} |
@ -0,0 +1,19 @@ |
|||||
|
package json |
||||
|
|
||||
|
import ( |
||||
|
"encoding/json" |
||||
|
"io" |
||||
|
|
||||
|
"gitoa.ru/go-4devs/encoding" |
||||
|
) |
||||
|
|
||||
|
var _ encoding.Decode = Decode |
||||
|
var _ encoding.Encode = Encode |
||||
|
|
||||
|
func Decode(r io.Reader, v interface{}) error { |
||||
|
return json.NewDecoder(r).Decode(v) |
||||
|
} |
||||
|
|
||||
|
func Encode(w io.Writer, v interface{}) error { |
||||
|
return json.NewEncoder(w).Encode(v) |
||||
|
} |
@ -0,0 +1,51 @@ |
|||||
|
package test |
||||
|
|
||||
|
import ( |
||||
|
"bytes" |
||||
|
"io" |
||||
|
"testing" |
||||
|
"time" |
||||
|
|
||||
|
"github.com/stretchr/testify/require" |
||||
|
"github.com/stretchr/testify/suite" |
||||
|
"gitoa.ru/go-4devs/encoding" |
||||
|
) |
||||
|
|
||||
|
type Data struct { |
||||
|
String string |
||||
|
Time time.Time |
||||
|
Struct SData |
||||
|
} |
||||
|
type SData struct { |
||||
|
ID int64 |
||||
|
} |
||||
|
|
||||
|
func expected() Data { |
||||
|
return Data{ |
||||
|
String: "string data", |
||||
|
Time: time.Date(2020, time.May, 24, 9, 15, 0, 0, time.UTC), |
||||
|
Struct: SData{ID: 42}, |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
type DecodeSuite struct { |
||||
|
suite.Suite |
||||
|
decode encoding.Decode |
||||
|
data io.Reader |
||||
|
} |
||||
|
|
||||
|
// RunSute run test by provider.
|
||||
|
func RunDecode(t *testing.T, decode encoding.Decode, data string) { |
||||
|
cs := DecodeSuite{ |
||||
|
decode: decode, |
||||
|
data: bytes.NewBufferString(data), |
||||
|
} |
||||
|
|
||||
|
suite.Run(t, &cs) |
||||
|
} |
||||
|
func (ds *DecodeSuite) TestDecode() { |
||||
|
var d Data |
||||
|
|
||||
|
require.Nil(ds.T(), ds.decode(ds.data, &d)) |
||||
|
require.Equal(ds.T(), expected(), d) |
||||
|
} |
@ -0,0 +1,22 @@ |
|||||
|
package toml |
||||
|
|
||||
|
import ( |
||||
|
"io" |
||||
|
|
||||
|
"github.com/BurntSushi/toml" |
||||
|
"gitoa.ru/go-4devs/encoding" |
||||
|
) |
||||
|
|
||||
|
var _ encoding.Decode = Decode |
||||
|
var _ encoding.Encode = Encode |
||||
|
|
||||
|
// Decode from reader to value.
|
||||
|
func Decode(r io.Reader, v interface{}) error { |
||||
|
_, err := toml.DecodeReader(r, v) |
||||
|
return err |
||||
|
} |
||||
|
|
||||
|
// Encode from value to writer.
|
||||
|
func Encode(w io.Writer, v interface{}) error { |
||||
|
return toml.NewEncoder(w).Encode(v) |
||||
|
} |
@ -0,0 +1,19 @@ |
|||||
|
package toml_test |
||||
|
|
||||
|
import ( |
||||
|
"testing" |
||||
|
|
||||
|
"gitoa.ru/go-4devs/encoding/test" |
||||
|
"gitoa.ru/go-4devs/encoding/toml" |
||||
|
) |
||||
|
|
||||
|
const data = ` |
||||
|
string = "string data" |
||||
|
time = 2020-05-24T09:15:00Z |
||||
|
[struct] |
||||
|
id = 42 |
||||
|
` |
||||
|
|
||||
|
func TestDecode(t *testing.T) { |
||||
|
test.RunDecode(t, toml.Decode, data) |
||||
|
} |
@ -0,0 +1,7 @@ |
|||||
|
package encoding |
||||
|
|
||||
|
// Unmarshal bytes to inteface.
|
||||
|
type Unmarshal func(data []byte, v interface{}) error |
||||
|
|
||||
|
// Marshal interface to bytes.
|
||||
|
type Marshal func(v interface{}) ([]byte, error) |
@ -0,0 +1,21 @@ |
|||||
|
package json |
||||
|
|
||||
|
import ( |
||||
|
"encoding/xml" |
||||
|
"io" |
||||
|
|
||||
|
"gitoa.ru/go-4devs/encoding" |
||||
|
) |
||||
|
|
||||
|
var _ encoding.Decode = Decode |
||||
|
var _ encoding.Encode = Encode |
||||
|
|
||||
|
// Decode from xml.
|
||||
|
func Decode(r io.Reader, v interface{}) error { |
||||
|
return xml.NewDecoder(r).Decode(v) |
||||
|
} |
||||
|
|
||||
|
// Encode to xml.
|
||||
|
func Encode(w io.Writer, v interface{}) error { |
||||
|
return xml.NewEncoder(w).Encode(v) |
||||
|
} |
@ -0,0 +1,24 @@ |
|||||
|
package yaml |
||||
|
|
||||
|
import ( |
||||
|
"io" |
||||
|
|
||||
|
"gitoa.ru/go-4devs/encoding" |
||||
|
"gopkg.in/yaml.v3" |
||||
|
) |
||||
|
|
||||
|
var _ encoding.Decode = Decode |
||||
|
var _ encoding.Encode = Encode |
||||
|
|
||||
|
// Decode from reader to value.
|
||||
|
func Decode(r io.Reader, v interface{}) error { |
||||
|
return yaml.NewDecoder(r).Decode(v) |
||||
|
} |
||||
|
|
||||
|
// Encode from value to writer.
|
||||
|
func Encode(w io.Writer, v interface{}) error { |
||||
|
enc := yaml.NewEncoder(w) |
||||
|
defer enc.Close() |
||||
|
|
||||
|
return enc.Encode(v) |
||||
|
} |
@ -0,0 +1,19 @@ |
|||||
|
package yaml_test |
||||
|
|
||||
|
import ( |
||||
|
"testing" |
||||
|
|
||||
|
"gitoa.ru/go-4devs/encoding/test" |
||||
|
"gitoa.ru/go-4devs/encoding/yaml" |
||||
|
) |
||||
|
|
||||
|
const data = ` |
||||
|
string: "string data" |
||||
|
time: 2020-05-24T09:15:00Z |
||||
|
struct: |
||||
|
id: 42 |
||||
|
` |
||||
|
|
||||
|
func TestDecode(t *testing.T) { |
||||
|
test.RunDecode(t, yaml.Decode, data) |
||||
|
} |
Loading…
Reference in new issue