From 97bdf7e10e5c65bbee4f86559e948a4770e99422 Mon Sep 17 00:00:00 2001 From: A Gardner <3100188+actgardner@users.noreply.github.com> Date: Sat, 16 Apr 2022 16:15:28 -0400 Subject: [PATCH] Fix removed enum fields throwing an error on deserialization --- v10/compiler/method.go | 6 +- v10/go.mod | 4 +- v10/go.sum | 4 + v10/test/enum-removed/enum_test_record.go | 181 ++++++++++++++++++ .../enum_test_record_container.go | 49 +++++ v10/test/enum-removed/evolution.avsc | 10 + v10/test/enum-removed/evolution.json | 11 ++ .../evolution/enum_test_record.go | 148 ++++++++++++++ .../evolution/enum_test_record_container.go | 49 +++++ v10/test/enum-removed/fixtures.json | 10 + v10/test/enum-removed/generate.go | 5 + v10/test/enum-removed/schema.avsc | 20 ++ v10/test/enum-removed/schema_test.go | 29 +++ v10/test/enum-removed/test_enum_type.go | 133 +++++++++++++ 14 files changed, 654 insertions(+), 5 deletions(-) create mode 100644 v10/test/enum-removed/enum_test_record.go create mode 100644 v10/test/enum-removed/enum_test_record_container.go create mode 100644 v10/test/enum-removed/evolution.avsc create mode 100644 v10/test/enum-removed/evolution.json create mode 100644 v10/test/enum-removed/evolution/enum_test_record.go create mode 100644 v10/test/enum-removed/evolution/enum_test_record_container.go create mode 100644 v10/test/enum-removed/fixtures.json create mode 100644 v10/test/enum-removed/generate.go create mode 100644 v10/test/enum-removed/schema.avsc create mode 100644 v10/test/enum-removed/schema_test.go create mode 100644 v10/test/enum-removed/test_enum_type.go diff --git a/v10/compiler/method.go b/v10/compiler/method.go index 42250efb..5bae9239 100644 --- a/v10/compiler/method.go +++ b/v10/compiler/method.go @@ -292,9 +292,9 @@ func (p *irMethod) compileRecord(writer, reader *schema.RecordDefinition) error func (p *irMethod) compileEnum(writer, reader *schema.EnumDefinition) error { log("compileEnum()\n writer:\n %v\n---\nreader: %v\n---\n", writer, reader) p.addLiteral(vm.Read, vm.Long) - errId := p.addError("Unexpected value for enum") - switchId := p.addSwitchStart(len(writer.Symbols()), errId) if reader != nil { + errId := p.addError("Unexpected value for enum") + switchId := p.addSwitchStart(len(writer.Symbols()), errId) for i, wSymbol := range writer.Symbols() { p.addSwitchCase(switchId, i, -1) rIdx := reader.SymbolIndex(wSymbol) @@ -313,8 +313,8 @@ func (p *irMethod) compileEnum(writer, reader *schema.EnumDefinition) error { p.addLiteral(vm.Halt, typedErrId) } } + p.addSwitchEnd(switchId) } - p.addSwitchEnd(switchId) return nil } diff --git a/v10/go.mod b/v10/go.mod index db2cf14f..fd1b0c82 100644 --- a/v10/go.mod +++ b/v10/go.mod @@ -4,8 +4,8 @@ go 1.17 require ( github.com/golang/snappy v0.0.4 - github.com/linkedin/goavro/v2 v2.11.0 - github.com/stretchr/testify v1.7.0 + github.com/linkedin/goavro/v2 v2.11.1 + github.com/stretchr/testify v1.7.1 ) require ( diff --git a/v10/go.sum b/v10/go.sum index 8bdd1458..172983c8 100644 --- a/v10/go.sum +++ b/v10/go.sum @@ -6,11 +6,15 @@ github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/linkedin/goavro/v2 v2.11.0 h1:AlU/NR32ESbC/dlzbhTjyqybwESupUCc3SrrHg2qdTg= github.com/linkedin/goavro/v2 v2.11.0/go.mod h1:UgQUb2N/pmueQYH9bfqFioWxzYCZXSfF8Jw03O5sjqA= +github.com/linkedin/goavro/v2 v2.11.1 h1:4cuAtbDfqkKnBXp9E+tRkIJGa6W6iAjwonwt8O1f4U0= +github.com/linkedin/goavro/v2 v2.11.1/go.mod h1:UgQUb2N/pmueQYH9bfqFioWxzYCZXSfF8Jw03O5sjqA= 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= +github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= +github.com/stretchr/testify v1.7.1/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= diff --git a/v10/test/enum-removed/enum_test_record.go b/v10/test/enum-removed/enum_test_record.go new file mode 100644 index 00000000..0afca119 --- /dev/null +++ b/v10/test/enum-removed/enum_test_record.go @@ -0,0 +1,181 @@ +// Code generated by github.com/actgardner/gogen-avro/v10. DO NOT EDIT. +/* + * SOURCE: + * schema.avsc + */ +package avro + +import ( + "encoding/json" + "fmt" + "io" + + "github.com/actgardner/gogen-avro/v10/compiler" + "github.com/actgardner/gogen-avro/v10/vm" + "github.com/actgardner/gogen-avro/v10/vm/types" +) + +var _ = fmt.Printf + +type EnumTestRecord struct { + StringField string `json:"stringField"` + + EnumField TestEnumType `json:"EnumField"` +} + +const EnumTestRecordAvroCRC64Fingerprint = "\xb9\x836\xc5\x18\xd3\xf2\xb3" + +func NewEnumTestRecord() EnumTestRecord { + r := EnumTestRecord{} + r.EnumField = TestEnumTypeTestSymbol3 + return r +} + +func DeserializeEnumTestRecord(r io.Reader) (EnumTestRecord, error) { + t := NewEnumTestRecord() + deser, err := compiler.CompileSchemaBytes([]byte(t.Schema()), []byte(t.Schema())) + if err != nil { + return t, err + } + + err = vm.Eval(r, deser, &t) + return t, err +} + +func DeserializeEnumTestRecordFromSchema(r io.Reader, schema string) (EnumTestRecord, error) { + t := NewEnumTestRecord() + + deser, err := compiler.CompileSchemaBytes([]byte(schema), []byte(t.Schema())) + if err != nil { + return t, err + } + + err = vm.Eval(r, deser, &t) + return t, err +} + +func writeEnumTestRecord(r EnumTestRecord, w io.Writer) error { + var err error + err = vm.WriteString(r.StringField, w) + if err != nil { + return err + } + err = writeTestEnumType(r.EnumField, w) + if err != nil { + return err + } + return err +} + +func (r EnumTestRecord) Serialize(w io.Writer) error { + return writeEnumTestRecord(r, w) +} + +func (r EnumTestRecord) Schema() string { + return "{\"fields\":[{\"name\":\"stringField\",\"type\":\"string\"},{\"default\":\"testSymbol3\",\"name\":\"EnumField\",\"type\":{\"doc\":\"Test \\nenum\",\"name\":\"TestEnumType\",\"symbols\":[\"TestSymbol1\",\"testSymbol2\",\"testSymbol3\"],\"type\":\"enum\"}}],\"name\":\"EnumTestRecord\",\"type\":\"record\"}" +} + +func (r EnumTestRecord) SchemaName() string { + return "EnumTestRecord" +} + +func (_ EnumTestRecord) SetBoolean(v bool) { panic("Unsupported operation") } +func (_ EnumTestRecord) SetInt(v int32) { panic("Unsupported operation") } +func (_ EnumTestRecord) SetLong(v int64) { panic("Unsupported operation") } +func (_ EnumTestRecord) SetFloat(v float32) { panic("Unsupported operation") } +func (_ EnumTestRecord) SetDouble(v float64) { panic("Unsupported operation") } +func (_ EnumTestRecord) SetBytes(v []byte) { panic("Unsupported operation") } +func (_ EnumTestRecord) SetString(v string) { panic("Unsupported operation") } +func (_ EnumTestRecord) SetUnionElem(v int64) { panic("Unsupported operation") } + +func (r *EnumTestRecord) Get(i int) types.Field { + switch i { + case 0: + w := types.String{Target: &r.StringField} + + return w + + case 1: + w := TestEnumTypeWrapper{Target: &r.EnumField} + + return w + + } + panic("Unknown field index") +} + +func (r *EnumTestRecord) SetDefault(i int) { + switch i { + case 1: + r.EnumField = TestEnumTypeTestSymbol3 + return + } + panic("Unknown field index") +} + +func (r *EnumTestRecord) NullField(i int) { + switch i { + } + panic("Not a nullable field index") +} + +func (_ EnumTestRecord) AppendMap(key string) types.Field { panic("Unsupported operation") } +func (_ EnumTestRecord) AppendArray() types.Field { panic("Unsupported operation") } +func (_ EnumTestRecord) HintSize(int) { panic("Unsupported operation") } +func (_ EnumTestRecord) Finalize() {} + +func (_ EnumTestRecord) AvroCRC64Fingerprint() []byte { + return []byte(EnumTestRecordAvroCRC64Fingerprint) +} + +func (r EnumTestRecord) MarshalJSON() ([]byte, error) { + var err error + output := make(map[string]json.RawMessage) + output["stringField"], err = json.Marshal(r.StringField) + if err != nil { + return nil, err + } + output["EnumField"], err = json.Marshal(r.EnumField) + if err != nil { + return nil, err + } + return json.Marshal(output) +} + +func (r *EnumTestRecord) UnmarshalJSON(data []byte) error { + var fields map[string]json.RawMessage + if err := json.Unmarshal(data, &fields); err != nil { + return err + } + + var val json.RawMessage + val = func() json.RawMessage { + if v, ok := fields["stringField"]; ok { + return v + } + return nil + }() + + if val != nil { + if err := json.Unmarshal([]byte(val), &r.StringField); err != nil { + return err + } + } else { + return fmt.Errorf("no value specified for stringField") + } + val = func() json.RawMessage { + if v, ok := fields["EnumField"]; ok { + return v + } + return nil + }() + + if val != nil { + if err := json.Unmarshal([]byte(val), &r.EnumField); err != nil { + return err + } + } else { + r.EnumField = TestEnumTypeTestSymbol3 + } + return nil +} diff --git a/v10/test/enum-removed/enum_test_record_container.go b/v10/test/enum-removed/enum_test_record_container.go new file mode 100644 index 00000000..68bb48e4 --- /dev/null +++ b/v10/test/enum-removed/enum_test_record_container.go @@ -0,0 +1,49 @@ +// Code generated by github.com/actgardner/gogen-avro/v10. DO NOT EDIT. +/* + * SOURCE: + * schema.avsc + */ +package avro + +import ( + "io" + + "github.com/actgardner/gogen-avro/v10/compiler" + "github.com/actgardner/gogen-avro/v10/container" + "github.com/actgardner/gogen-avro/v10/vm" +) + +func NewEnumTestRecordWriter(writer io.Writer, codec container.Codec, recordsPerBlock int64) (*container.Writer, error) { + str := NewEnumTestRecord() + return container.NewWriter(writer, codec, recordsPerBlock, str.Schema()) +} + +// container reader +type EnumTestRecordReader struct { + r io.Reader + p *vm.Program +} + +func NewEnumTestRecordReader(r io.Reader) (*EnumTestRecordReader, error) { + containerReader, err := container.NewReader(r) + if err != nil { + return nil, err + } + + t := NewEnumTestRecord() + deser, err := compiler.CompileSchemaBytes([]byte(containerReader.AvroContainerSchema()), []byte(t.Schema())) + if err != nil { + return nil, err + } + + return &EnumTestRecordReader{ + r: containerReader, + p: deser, + }, nil +} + +func (r EnumTestRecordReader) Read() (EnumTestRecord, error) { + t := NewEnumTestRecord() + err := vm.Eval(r.r, r.p, &t) + return t, err +} diff --git a/v10/test/enum-removed/evolution.avsc b/v10/test/enum-removed/evolution.avsc new file mode 100644 index 00000000..69e9466d --- /dev/null +++ b/v10/test/enum-removed/evolution.avsc @@ -0,0 +1,10 @@ +{ + "type": "record", + "name": "EnumTestRecord", + "fields": [ + { + "name": "stringField", + "type": "string" + } + ] +} diff --git a/v10/test/enum-removed/evolution.json b/v10/test/enum-removed/evolution.json new file mode 100644 index 00000000..fbcfef0a --- /dev/null +++ b/v10/test/enum-removed/evolution.json @@ -0,0 +1,11 @@ +[ + { + "data": { + "stringField": "testString", + "EnumField": "testSymbol2" + }, + "expected": { + "stringField": "testString" + } + } +] diff --git a/v10/test/enum-removed/evolution/enum_test_record.go b/v10/test/enum-removed/evolution/enum_test_record.go new file mode 100644 index 00000000..d3618ac7 --- /dev/null +++ b/v10/test/enum-removed/evolution/enum_test_record.go @@ -0,0 +1,148 @@ +// Code generated by github.com/actgardner/gogen-avro/v10. DO NOT EDIT. +/* + * SOURCE: + * evolution.avsc + */ +package avro + +import ( + "encoding/json" + "fmt" + "io" + + "github.com/actgardner/gogen-avro/v10/compiler" + "github.com/actgardner/gogen-avro/v10/vm" + "github.com/actgardner/gogen-avro/v10/vm/types" +) + +var _ = fmt.Printf + +type EnumTestRecord struct { + StringField string `json:"stringField"` +} + +const EnumTestRecordAvroCRC64Fingerprint = "\xc7QH\vt~\x8fP" + +func NewEnumTestRecord() EnumTestRecord { + r := EnumTestRecord{} + return r +} + +func DeserializeEnumTestRecord(r io.Reader) (EnumTestRecord, error) { + t := NewEnumTestRecord() + deser, err := compiler.CompileSchemaBytes([]byte(t.Schema()), []byte(t.Schema())) + if err != nil { + return t, err + } + + err = vm.Eval(r, deser, &t) + return t, err +} + +func DeserializeEnumTestRecordFromSchema(r io.Reader, schema string) (EnumTestRecord, error) { + t := NewEnumTestRecord() + + deser, err := compiler.CompileSchemaBytes([]byte(schema), []byte(t.Schema())) + if err != nil { + return t, err + } + + err = vm.Eval(r, deser, &t) + return t, err +} + +func writeEnumTestRecord(r EnumTestRecord, w io.Writer) error { + var err error + err = vm.WriteString(r.StringField, w) + if err != nil { + return err + } + return err +} + +func (r EnumTestRecord) Serialize(w io.Writer) error { + return writeEnumTestRecord(r, w) +} + +func (r EnumTestRecord) Schema() string { + return "{\"fields\":[{\"name\":\"stringField\",\"type\":\"string\"}],\"name\":\"EnumTestRecord\",\"type\":\"record\"}" +} + +func (r EnumTestRecord) SchemaName() string { + return "EnumTestRecord" +} + +func (_ EnumTestRecord) SetBoolean(v bool) { panic("Unsupported operation") } +func (_ EnumTestRecord) SetInt(v int32) { panic("Unsupported operation") } +func (_ EnumTestRecord) SetLong(v int64) { panic("Unsupported operation") } +func (_ EnumTestRecord) SetFloat(v float32) { panic("Unsupported operation") } +func (_ EnumTestRecord) SetDouble(v float64) { panic("Unsupported operation") } +func (_ EnumTestRecord) SetBytes(v []byte) { panic("Unsupported operation") } +func (_ EnumTestRecord) SetString(v string) { panic("Unsupported operation") } +func (_ EnumTestRecord) SetUnionElem(v int64) { panic("Unsupported operation") } + +func (r *EnumTestRecord) Get(i int) types.Field { + switch i { + case 0: + w := types.String{Target: &r.StringField} + + return w + + } + panic("Unknown field index") +} + +func (r *EnumTestRecord) SetDefault(i int) { + switch i { + } + panic("Unknown field index") +} + +func (r *EnumTestRecord) NullField(i int) { + switch i { + } + panic("Not a nullable field index") +} + +func (_ EnumTestRecord) AppendMap(key string) types.Field { panic("Unsupported operation") } +func (_ EnumTestRecord) AppendArray() types.Field { panic("Unsupported operation") } +func (_ EnumTestRecord) HintSize(int) { panic("Unsupported operation") } +func (_ EnumTestRecord) Finalize() {} + +func (_ EnumTestRecord) AvroCRC64Fingerprint() []byte { + return []byte(EnumTestRecordAvroCRC64Fingerprint) +} + +func (r EnumTestRecord) MarshalJSON() ([]byte, error) { + var err error + output := make(map[string]json.RawMessage) + output["stringField"], err = json.Marshal(r.StringField) + if err != nil { + return nil, err + } + return json.Marshal(output) +} + +func (r *EnumTestRecord) UnmarshalJSON(data []byte) error { + var fields map[string]json.RawMessage + if err := json.Unmarshal(data, &fields); err != nil { + return err + } + + var val json.RawMessage + val = func() json.RawMessage { + if v, ok := fields["stringField"]; ok { + return v + } + return nil + }() + + if val != nil { + if err := json.Unmarshal([]byte(val), &r.StringField); err != nil { + return err + } + } else { + return fmt.Errorf("no value specified for stringField") + } + return nil +} diff --git a/v10/test/enum-removed/evolution/enum_test_record_container.go b/v10/test/enum-removed/evolution/enum_test_record_container.go new file mode 100644 index 00000000..b7185c0b --- /dev/null +++ b/v10/test/enum-removed/evolution/enum_test_record_container.go @@ -0,0 +1,49 @@ +// Code generated by github.com/actgardner/gogen-avro/v10. DO NOT EDIT. +/* + * SOURCE: + * evolution.avsc + */ +package avro + +import ( + "io" + + "github.com/actgardner/gogen-avro/v10/compiler" + "github.com/actgardner/gogen-avro/v10/container" + "github.com/actgardner/gogen-avro/v10/vm" +) + +func NewEnumTestRecordWriter(writer io.Writer, codec container.Codec, recordsPerBlock int64) (*container.Writer, error) { + str := NewEnumTestRecord() + return container.NewWriter(writer, codec, recordsPerBlock, str.Schema()) +} + +// container reader +type EnumTestRecordReader struct { + r io.Reader + p *vm.Program +} + +func NewEnumTestRecordReader(r io.Reader) (*EnumTestRecordReader, error) { + containerReader, err := container.NewReader(r) + if err != nil { + return nil, err + } + + t := NewEnumTestRecord() + deser, err := compiler.CompileSchemaBytes([]byte(containerReader.AvroContainerSchema()), []byte(t.Schema())) + if err != nil { + return nil, err + } + + return &EnumTestRecordReader{ + r: containerReader, + p: deser, + }, nil +} + +func (r EnumTestRecordReader) Read() (EnumTestRecord, error) { + t := NewEnumTestRecord() + err := vm.Eval(r.r, r.p, &t) + return t, err +} diff --git a/v10/test/enum-removed/fixtures.json b/v10/test/enum-removed/fixtures.json new file mode 100644 index 00000000..48e434f5 --- /dev/null +++ b/v10/test/enum-removed/fixtures.json @@ -0,0 +1,10 @@ +[ + { + "stringField": "someString", + "EnumField": "TestSymbol1" + }, + { + "stringField": "sameStrong", + "EnumField": "testSymbol2" + } +] diff --git a/v10/test/enum-removed/generate.go b/v10/test/enum-removed/generate.go new file mode 100644 index 00000000..083606f7 --- /dev/null +++ b/v10/test/enum-removed/generate.go @@ -0,0 +1,5 @@ +package avro + +//go:generate $GOPATH/bin/gogen-avro -containers . schema.avsc +//go:generate mkdir -p evolution +//go:generate $GOPATH/bin/gogen-avro -containers evolution evolution.avsc diff --git a/v10/test/enum-removed/schema.avsc b/v10/test/enum-removed/schema.avsc new file mode 100644 index 00000000..0c5064a6 --- /dev/null +++ b/v10/test/enum-removed/schema.avsc @@ -0,0 +1,20 @@ +{ + "type": "record", + "name": "EnumTestRecord", + "fields": [ + { + "name": "stringField", + "type": "string" + }, + { + "name": "EnumField", + "type": { + "name": "TestEnumType", + "type": "enum", + "doc": "Test \nenum", + "symbols": ["TestSymbol1", "testSymbol2", "testSymbol3"] + }, + "default": "testSymbol3" + } + ] +} diff --git a/v10/test/enum-removed/schema_test.go b/v10/test/enum-removed/schema_test.go new file mode 100644 index 00000000..a35f8e3f --- /dev/null +++ b/v10/test/enum-removed/schema_test.go @@ -0,0 +1,29 @@ +package avro + +import ( + "io" + "testing" + + "github.com/actgardner/gogen-avro/v10/container" + "github.com/actgardner/gogen-avro/v10/test" + evolution "github.com/actgardner/gogen-avro/v10/test/enum-removed/evolution" +) + +func TestRoundTrip(t *testing.T) { + test.RoundTripExactBytes(t, + func() container.AvroRecord { return &EnumTestRecord{} }, + func(r io.Reader) (container.AvroRecord, error) { + record, err := DeserializeEnumTestRecord(r) + return &record, err + }) +} + +func TestEvolution(t *testing.T) { + test.RoundTripEvolution(t, + func() container.AvroRecord { return &EnumTestRecord{} }, + func() container.AvroRecord { return &evolution.EnumTestRecord{} }, + func(r io.Reader, schema string) (container.AvroRecord, error) { + record, err := evolution.DeserializeEnumTestRecordFromSchema(r, schema) + return &record, err + }) +} diff --git a/v10/test/enum-removed/test_enum_type.go b/v10/test/enum-removed/test_enum_type.go new file mode 100644 index 00000000..5cb3242a --- /dev/null +++ b/v10/test/enum-removed/test_enum_type.go @@ -0,0 +1,133 @@ +// Code generated by github.com/actgardner/gogen-avro/v10. DO NOT EDIT. +/* + * SOURCE: + * schema.avsc + */ +package avro + +import ( + "encoding/json" + "fmt" + "io" + + "github.com/actgardner/gogen-avro/v10/vm" + "github.com/actgardner/gogen-avro/v10/vm/types" +) + +var _ = fmt.Printf + +// Test enum +type TestEnumType int32 + +const ( + TestEnumTypeTestSymbol1 TestEnumType = 0 + TestEnumTypeTestSymbol2 TestEnumType = 1 + TestEnumTypeTestSymbol3 TestEnumType = 2 +) + +func (e TestEnumType) String() string { + switch e { + case TestEnumTypeTestSymbol1: + return "TestSymbol1" + case TestEnumTypeTestSymbol2: + return "testSymbol2" + case TestEnumTypeTestSymbol3: + return "testSymbol3" + } + return "unknown" +} + +func writeTestEnumType(r TestEnumType, w io.Writer) error { + return vm.WriteInt(int32(r), w) +} + +func NewTestEnumTypeValue(raw string) (r TestEnumType, err error) { + switch raw { + case "TestSymbol1": + return TestEnumTypeTestSymbol1, nil + case "testSymbol2": + return TestEnumTypeTestSymbol2, nil + case "testSymbol3": + return TestEnumTypeTestSymbol3, nil + } + + return -1, fmt.Errorf("invalid value for TestEnumType: '%s'", raw) + +} + +func (b TestEnumType) MarshalJSON() ([]byte, error) { + return json.Marshal(b.String()) +} + +func (b *TestEnumType) UnmarshalJSON(data []byte) error { + var stringVal string + err := json.Unmarshal(data, &stringVal) + if err != nil { + return err + } + val, err := NewTestEnumTypeValue(stringVal) + *b = val + return err +} + +type TestEnumTypeWrapper struct { + Target *TestEnumType +} + +func (b TestEnumTypeWrapper) SetBoolean(v bool) { + panic("Unable to assign boolean to int field") +} + +func (b TestEnumTypeWrapper) SetInt(v int32) { + *(b.Target) = TestEnumType(v) +} + +func (b TestEnumTypeWrapper) SetLong(v int64) { + panic("Unable to assign long to int field") +} + +func (b TestEnumTypeWrapper) SetFloat(v float32) { + panic("Unable to assign float to int field") +} + +func (b TestEnumTypeWrapper) SetUnionElem(v int64) { + panic("Unable to assign union elem to int field") +} + +func (b TestEnumTypeWrapper) SetDouble(v float64) { + panic("Unable to assign double to int field") +} + +func (b TestEnumTypeWrapper) SetBytes(v []byte) { + panic("Unable to assign bytes to int field") +} + +func (b TestEnumTypeWrapper) SetString(v string) { + panic("Unable to assign string to int field") +} + +func (b TestEnumTypeWrapper) Get(i int) types.Field { + panic("Unable to get field from int field") +} + +func (b TestEnumTypeWrapper) SetDefault(i int) { + panic("Unable to set default on int field") +} + +func (b TestEnumTypeWrapper) AppendMap(key string) types.Field { + panic("Unable to append map key to from int field") +} + +func (b TestEnumTypeWrapper) AppendArray() types.Field { + panic("Unable to append array element to from int field") +} + +func (b TestEnumTypeWrapper) NullField(int) { + panic("Unable to null field in int field") +} + +func (b TestEnumTypeWrapper) HintSize(int) { + panic("Unable to hint size in int field") +} + +func (b TestEnumTypeWrapper) Finalize() {}