()
| 120 | } |
| 121 | |
| 122 | func (amf *AMF) Unmarshal() (obj any, err error) { |
| 123 | if !amf.CanRead() { |
| 124 | return nil, io.ErrUnexpectedEOF |
| 125 | } |
| 126 | defer func(b Buffer) { |
| 127 | if err != nil { |
| 128 | amf.Buffer = b |
| 129 | } |
| 130 | }(amf.Buffer) |
| 131 | switch t := amf.ReadByte(); t { |
| 132 | case AMF0_NUMBER: |
| 133 | if !amf.CanReadN(8) { |
| 134 | return 0, io.ErrUnexpectedEOF |
| 135 | } |
| 136 | obj = amf.ReadFloat64() |
| 137 | case AMF0_BOOLEAN: |
| 138 | if !amf.CanRead() { |
| 139 | return false, io.ErrUnexpectedEOF |
| 140 | } |
| 141 | obj = amf.ReadByte() == 1 |
| 142 | case AMF0_STRING: |
| 143 | obj, err = amf.readKey() |
| 144 | case AMF0_OBJECT: |
| 145 | m := make(map[string]any) |
| 146 | for err == nil && obj == nil { |
| 147 | obj, err = amf.readProperty(m) |
| 148 | } |
| 149 | case AMF0_NULL: |
| 150 | return nil, nil |
| 151 | case AMF0_UNDEFINED: |
| 152 | return Undefined, nil |
| 153 | case AMF0_ECMA_ARRAY: |
| 154 | _ = amf.ReadUint32() |
| 155 | for m := make(EcmaArray); err == nil && obj == nil; obj, err = amf.readProperty(m) { |
| 156 | } |
| 157 | case AMF0_END_OBJECT: |
| 158 | return ObjectEnd, nil |
| 159 | case AMF0_STRICT_ARRAY: |
| 160 | size := amf.ReadUint32() |
| 161 | var list []any |
| 162 | for i := uint32(0); i < size; i++ { |
| 163 | v, err := amf.Unmarshal() |
| 164 | if err != nil { |
| 165 | return nil, err |
| 166 | } |
| 167 | list = append(list, v) |
| 168 | } |
| 169 | obj = list |
| 170 | case AMF0_DATE: |
| 171 | if !amf.CanReadN(10) { |
| 172 | return 0, io.ErrUnexpectedEOF |
| 173 | } |
| 174 | obj = amf.ReadFloat64() |
| 175 | amf.ReadN(2) |
| 176 | case AMF0_LONG_STRING, |
| 177 | AMF0_XML_DOCUMENT: |
| 178 | if !amf.CanReadN(4) { |
| 179 | return "", io.ErrUnexpectedEOF |
no test coverage detected