49 lines
976 B
Go
49 lines
976 B
Go
|
package ormfield
|
||
|
|
||
|
import (
|
||
|
"encoding/binary"
|
||
|
io "io"
|
||
|
|
||
|
"google.golang.org/protobuf/reflect/protoreflect"
|
||
|
)
|
||
|
|
||
|
// EnumCodec encodes enum values as varints.
|
||
|
type EnumCodec struct{}
|
||
|
|
||
|
func (e EnumCodec) Decode(r Reader) (protoreflect.Value, error) {
|
||
|
x, err := binary.ReadVarint(r)
|
||
|
return protoreflect.ValueOfEnum(protoreflect.EnumNumber(x)), err
|
||
|
}
|
||
|
|
||
|
func (e EnumCodec) Encode(value protoreflect.Value, w io.Writer) error {
|
||
|
x := value.Enum()
|
||
|
buf := make([]byte, binary.MaxVarintLen32)
|
||
|
n := binary.PutVarint(buf, int64(x))
|
||
|
_, err := w.Write(buf[:n])
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
func (e EnumCodec) Compare(v1, v2 protoreflect.Value) int {
|
||
|
x := v1.Enum()
|
||
|
y := v2.Enum()
|
||
|
if x == y {
|
||
|
return 0
|
||
|
} else if x < y {
|
||
|
return -1
|
||
|
} else {
|
||
|
return 1
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (e EnumCodec) IsOrdered() bool {
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
func (e EnumCodec) FixedBufferSize() int {
|
||
|
return binary.MaxVarintLen32
|
||
|
}
|
||
|
|
||
|
func (e EnumCodec) ComputeBufferSize(protoreflect.Value) (int, error) {
|
||
|
return e.FixedBufferSize(), nil
|
||
|
}
|