MCPcopy
hub / github.com/adonovan/gopl.io / encode

Function encode

ch12/sexpr/encode.go:28–95  ·  view source on GitHub ↗

!-Marshal encode writes to buf an S-expression representation of v. !+encode

(buf *bytes.Buffer, v reflect.Value)

Source from the content-addressed store, hash-verified

26// encode writes to buf an S-expression representation of v.
27//!+encode
28func encode(buf *bytes.Buffer, v reflect.Value) error {
29 switch v.Kind() {
30 case reflect.Invalid:
31 buf.WriteString("nil")
32
33 case reflect.Int, reflect.Int8, reflect.Int16,
34 reflect.Int32, reflect.Int64:
35 fmt.Fprintf(buf, "%d", v.Int())
36
37 case reflect.Uint, reflect.Uint8, reflect.Uint16,
38 reflect.Uint32, reflect.Uint64, reflect.Uintptr:
39 fmt.Fprintf(buf, "%d", v.Uint())
40
41 case reflect.String:
42 fmt.Fprintf(buf, "%q", v.String())
43
44 case reflect.Ptr:
45 return encode(buf, v.Elem())
46
47 case reflect.Array, reflect.Slice: // (value ...)
48 buf.WriteByte('(')
49 for i := 0; i < v.Len(); i++ {
50 if i > 0 {
51 buf.WriteByte(' ')
52 }
53 if err := encode(buf, v.Index(i)); err != nil {
54 return err
55 }
56 }
57 buf.WriteByte(')')
58
59 case reflect.Struct: // ((name value) ...)
60 buf.WriteByte('(')
61 for i := 0; i < v.NumField(); i++ {
62 if i > 0 {
63 buf.WriteByte(' ')
64 }
65 fmt.Fprintf(buf, "(%s ", v.Type().Field(i).Name)
66 if err := encode(buf, v.Field(i)); err != nil {
67 return err
68 }
69 buf.WriteByte(')')
70 }
71 buf.WriteByte(')')
72
73 case reflect.Map: // ((key value) ...)
74 buf.WriteByte('(')
75 for i, key := range v.MapKeys() {
76 if i > 0 {
77 buf.WriteByte(' ')
78 }
79 buf.WriteByte('(')
80 if err := encode(buf, key); err != nil {
81 return err
82 }
83 buf.WriteByte(' ')
84 if err := encode(buf, v.MapIndex(key)); err != nil {
85 return err

Callers 1

MarshalFunction · 0.85

Calls 2

StringMethod · 0.45
LenMethod · 0.45

Tested by

no test coverage detected