From dbf201b61a9f3d9e55d6744009f0f8f35c204e9d Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Tue, 11 Aug 2015 15:13:49 +0200 Subject: Draft --- ber/marshal.go | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) (limited to 'ber/marshal.go') diff --git a/ber/marshal.go b/ber/marshal.go index 25e0cb1..282ab45 100644 --- a/ber/marshal.go +++ b/ber/marshal.go @@ -5,19 +5,6 @@ import ( "reflect" ) -type Marshaler interface { - Marshal() ([]byte, error) -} - -type Unmarshaler interface { - Unmarshal([]byte) error -} - -type ASN1 interface { - Marshaler - Unmarshaler -} - type encodeState struct { bytes.Buffer } @@ -57,6 +44,10 @@ 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 } @@ -80,10 +71,28 @@ func (e *encodeState) error(err error) { 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) { + for i := 0; i < v.NumField(); i++ { + e.reflectValue(v.Field(i)) + } +} + +func sliceEncoder(e *encodeState, v reflect.Value) { + e.Write(v.Bytes()) +} -- cgit v1.2.3