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()) } */ }