(node any, decodedToken string, nameProvider NameProvider)
| 379 | } |
| 380 | |
| 381 | func (p *Pointer) resolveNodeForToken(node any, decodedToken string, nameProvider NameProvider) (next any, err error) { |
| 382 | // check for nil during traversal |
| 383 | if isNil(node) { |
| 384 | return nil, fmt.Errorf("cannot traverse through nil value at %q: %w", decodedToken, ErrPointer) |
| 385 | } |
| 386 | |
| 387 | pointable, ok := node.(JSONPointable) |
| 388 | if ok { |
| 389 | r, err := pointable.JSONLookup(decodedToken) |
| 390 | if err != nil { |
| 391 | return nil, err |
| 392 | } |
| 393 | |
| 394 | fld := reflect.ValueOf(r) |
| 395 | if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Pointer { |
| 396 | return fld.Addr().Interface(), nil |
| 397 | } |
| 398 | |
| 399 | return r, nil |
| 400 | } |
| 401 | |
| 402 | rValue := reflect.Indirect(reflect.ValueOf(node)) |
| 403 | kind := rValue.Kind() |
| 404 | |
| 405 | switch kind { |
| 406 | case reflect.Struct: |
| 407 | nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken) |
| 408 | if !ok { |
| 409 | return nil, fmt.Errorf("object has no field %q: %w", decodedToken, ErrPointer) |
| 410 | } |
| 411 | |
| 412 | return typeFromValue(rValue.FieldByName(nm)), nil |
| 413 | |
| 414 | case reflect.Map: |
| 415 | kv := reflect.ValueOf(decodedToken) |
| 416 | mv := rValue.MapIndex(kv) |
| 417 | |
| 418 | if !mv.IsValid() { |
| 419 | return nil, errNoKey(decodedToken) |
| 420 | } |
| 421 | |
| 422 | return typeFromValue(mv), nil |
| 423 | |
| 424 | case reflect.Slice: |
| 425 | if decodedToken == dashToken { |
| 426 | return nil, errDashIntermediate() |
| 427 | } |
| 428 | tokenIndex, err := strconv.Atoi(decodedToken) |
| 429 | if err != nil { |
| 430 | return nil, errors.Join(err, ErrPointer) |
| 431 | } |
| 432 | |
| 433 | sLength := rValue.Len() |
| 434 | if tokenIndex < 0 || tokenIndex >= sLength { |
| 435 | return nil, errOutOfBounds(sLength, tokenIndex) |
| 436 | } |
| 437 | |
| 438 | return typeFromValue(rValue.Index(tokenIndex)), nil |
no test coverage detected