aboutsummaryrefslogtreecommitdiff
path: root/ber/encode.go
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2015-09-26 12:04:34 +0200
committerDimitri Sokolyuk <demon@dim13.org>2015-09-26 12:04:34 +0200
commit54caa4e7e085e177ff05b719ae247d21fe8c257e (patch)
tree363400fe1c6c1e7b696c72caaabc4882756355fa /ber/encode.go
parent1fcefc99a82bac6ce725b6f11277e4aa291a7f51 (diff)
Replace with new implementation
Diffstat (limited to 'ber/encode.go')
-rw-r--r--ber/encode.go118
1 files changed, 118 insertions, 0 deletions
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())
+ }
+ */
+}