| 258 | } |
| 259 | |
| 260 | func (p *Pointer) set(node, data any, nameProvider NameProvider) (any, error) { |
| 261 | knd := reflect.ValueOf(node).Kind() |
| 262 | |
| 263 | if knd != reflect.Pointer && knd != reflect.Struct && knd != reflect.Map && knd != reflect.Slice && knd != reflect.Array { |
| 264 | return node, errors.Join( |
| 265 | fmt.Errorf("unexpected type: %T", node), //nolint:err113 // err wrapping is carried out by errors.Join, not fmt.Errorf. |
| 266 | ErrUnsupportedValueType, |
| 267 | ErrPointer, |
| 268 | ) |
| 269 | } |
| 270 | |
| 271 | // full document when empty |
| 272 | if len(p.referenceTokens) == 0 { |
| 273 | return node, nil |
| 274 | } |
| 275 | |
| 276 | if nameProvider == nil { |
| 277 | nameProvider = defaultOptions.provider |
| 278 | } |
| 279 | |
| 280 | return p.setAt(node, p.referenceTokens, data, nameProvider) |
| 281 | } |
| 282 | |
| 283 | // setAt recursively walks the token list, setting the data at the terminal token and rebinding any |
| 284 | // new child reference (e.g. a slice header returned by an "-" append) into its parent on the way |