| 233 | } |
| 234 | |
| 235 | func nestedWalkFillTxNonce(rv reflect.Value, fieldPath string, signCallback func(fieldPath string, rv reflect.Value) (err error)) (signed bool, err error) { |
| 236 | rv = reflect.Indirect(rv) |
| 237 | |
| 238 | switch rv.Kind() { |
| 239 | case reflect.Bool, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Float32, |
| 240 | reflect.Float64, reflect.Complex64, reflect.Complex128, reflect.Chan, reflect.Interface, reflect.Ptr, |
| 241 | reflect.String, reflect.UnsafePointer, reflect.Func: |
| 242 | return |
| 243 | case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: |
| 244 | if _, ok := rv.Interface().(pi.AccountNonce); ok { |
| 245 | if err = signCallback(fieldPath, rv); err != nil { |
| 246 | return |
| 247 | } |
| 248 | return true, nil |
| 249 | } |
| 250 | case reflect.Array, reflect.Slice: |
| 251 | for i := 0; i != rv.Len(); i++ { |
| 252 | fieldName := fieldPath |
| 253 | if fieldPath != "" { |
| 254 | fieldName += "." |
| 255 | } |
| 256 | fieldName += fmt.Sprintf("[%d]", i) |
| 257 | if signed, err = nestedWalkFillTxNonce(rv.Index(i), fieldName, signCallback); err != nil || signed { |
| 258 | return |
| 259 | } |
| 260 | } |
| 261 | case reflect.Map: |
| 262 | for _, k := range rv.MapKeys() { |
| 263 | fieldName := fieldPath |
| 264 | if fieldPath != "" { |
| 265 | fieldName += "." |
| 266 | } |
| 267 | fieldName += fmt.Sprintf("[%v]", k) |
| 268 | if signed, err = nestedWalkFillTxNonce(rv.MapIndex(k), fieldName, signCallback); err != nil || signed { |
| 269 | return |
| 270 | } |
| 271 | } |
| 272 | case reflect.Struct: |
| 273 | for i := 0; i != rv.NumField(); i++ { |
| 274 | // walk inside |
| 275 | fieldName := fieldPath |
| 276 | if fieldPath != "" { |
| 277 | fieldName += "." |
| 278 | } |
| 279 | fieldName += rv.Type().Field(i).Name |
| 280 | |
| 281 | if _, ok := rv.Field(i).Interface().(pi.AccountNonce); ok { |
| 282 | if err = signCallback(fieldName, rv.Field(i)); err != nil { |
| 283 | return |
| 284 | } |
| 285 | return true, nil |
| 286 | } else if signed, err = nestedWalkFillTxNonce(rv.Field(i), fieldName, signCallback); err != nil || signed { |
| 287 | return |
| 288 | } |
| 289 | } |
| 290 | } |
| 291 | |
| 292 | return |