From 54caa4e7e085e177ff05b719ae247d21fe8c257e Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sat, 26 Sep 2015 12:04:34 +0200 Subject: Replace with new implementation --- ber/encode.go | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 ber/encode.go (limited to 'ber/encode.go') diff --git a/ber/encode.go b/ber/encode.go new file mode 100644 index 0000000..87f19f1 --- /dev/null +++ b/ber/encode.go @@ -0,0 +1,118 @@ +package ber + +import ( + "bytes" + "reflect" +) + +type encodeState struct { + bytes.Buffer +} + +func Marshal(v interface{}) ([]byte, error) { + e := &encodeState{} + err := e.marshal(v) + if err != nil { + return nil, err + } + return e.Bytes(), nil +} + +func (e *encodeState) marshal(v interface{}) (err error) { + e.reflectValue(reflect.ValueOf(v)) + return nil +} + +func (e *encodeState) reflectValue(v reflect.Value) { + valueEncoder(v)(e, v) +} + +type encoderFunc func(e *encodeState, v reflect.Value) + +func valueEncoder(v reflect.Value) encoderFunc { + if !v.IsValid() { + return invalidValueEncoder + } + return newTypeEncoder(v.Type()) +} + +func invalidValueEncoder(e *encodeState, v reflect.Value) { + e.WriteByte(0) +} + +func newTypeEncoder(t reflect.Type) encoderFunc { + switch t.Kind() { + case reflect.Int: + return intEncoder + case reflect.Struct: + return structEncoder + case reflect.Slice: + return sliceEncoder + default: + return unsupportedTypeEncoder + } +} + +type UnsupportedTypeError struct { + Type reflect.Type +} + +func (e *UnsupportedTypeError) Error() string { + return "BER: unsupported type: " + e.Type.String() +} + +func unsupportedTypeEncoder(e *encodeState, v reflect.Value) { + e.error(&UnsupportedTypeError{v.Type()}) +} + +func (e *encodeState) error(err error) { + panic(err) +} + +func intEncoder(e *encodeState, v reflect.Value) { + /* + b := MarshalInt(int(v.Int())) + l := MarshalLen(len(b)) + t := MarshalClass(classUniversal, kindPrimitive, tagInteger) + e.Write(t) + e.Write(l) + e.Write(b) + */ +} + +func objEncoder(e *encodeState, v reflect.Value) { + /* + b := MarshalOID(v.Interface().(OID)) + l := MarshalLen(len(b)) + t := MarshalClass(classUniversal, kindPrimitive, tagObjectIdentifier) + e.Write(t) + e.Write(l) + e.Write(b) + */ +} + +func structEncoder(e *encodeState, v reflect.Value) { + /* + sube := &encodeState{} + for i := 0; i < v.NumField(); i++ { + sube.reflectValue(v.Field(i)) + } + b := sube.Bytes() + l := MarshalLen(len(b)) + t := MarshalClass(classUniversal, kindConstructed, tagSequence) + e.Write(t) + e.Write(l) + e.Write(b) + */ +} + +func sliceEncoder(e *encodeState, v reflect.Value) { + /* + if v.IsNil() { + e.Write(MarshalClass(classUniversal, kindPrimitive, tagNull)) + e.Write([]byte{0}) + } else { + e.Write(v.Bytes()) + } + */ +} -- cgit v1.2.3