| 900 | } |
| 901 | |
| 902 | func (dec *Decoder) Decode(cjson []byte, dest any) (err error) { |
| 903 | |
| 904 | dec.state.lock.RLock() |
| 905 | defer dec.state.lock.RUnlock() |
| 906 | |
| 907 | ser := &Serializer{buf: cjson} |
| 908 | |
| 909 | defer func() { |
| 910 | if ret := recover(); ret != nil { |
| 911 | if dec.loggerOwner != nil { |
| 912 | if logger := dec.loggerOwner.GetLogger(); logger != nil { |
| 913 | logger.Printf(bindings.ERROR, |
| 914 | "Interface: %#v\nRead position: %d\nTags(v%d): %v\nTags cache: %+v\nData dump:\n%s\nError: %v\nTagsMatcher: { state_token: 0x%08X, version: %d }\n", |
| 915 | dest, |
| 916 | ser.Pos(), |
| 917 | dec.state.Version, |
| 918 | dec.state.tagsMatcher.Names, |
| 919 | dec.state.structCache, |
| 920 | hex.Dump(ser.Bytes()), |
| 921 | ret, |
| 922 | uint32(dec.state.StateToken), |
| 923 | dec.state.Version, |
| 924 | ) |
| 925 | } |
| 926 | } |
| 927 | switch v := ret.(type) { |
| 928 | case error: |
| 929 | err = v |
| 930 | default: |
| 931 | err = fmt.Errorf("rq: Decode error: %v", ret) |
| 932 | } |
| 933 | } |
| 934 | }() |
| 935 | |
| 936 | fieldsoutcnt := make([]int, MaxIndexes) |
| 937 | ctagsPath := make([]int16, 0, 16) |
| 938 | |
| 939 | dec.decodeValue(nil, ser, reflect.ValueOf(dest), fieldsoutcnt, ctagsPath) |
| 940 | // if !ser.Eof() { |
| 941 | // panic(fmt.Errorf("Internal error - left unparsed data")) |
| 942 | // } |
| 943 | return err |
| 944 | } |