Skip to content

Add unmarshaler interface#166

Merged
sagikazarmark merged 3 commits intomainfrom
unmarshal2
Jan 12, 2026
Merged

Add unmarshaler interface#166
sagikazarmark merged 3 commits intomainfrom
unmarshal2

Conversation

@sagikazarmark
Copy link
Copy Markdown
Member

@sagikazarmark sagikazarmark commented Jan 12, 2026

Based on the PRs below. I opted for creating a new PR, because some of the edge cases weren't handled and tests were AI slob.

Fixes #11
Fixes #155
Fixes #164

Signed-off-by: Mark Sagi-Kazar <mark.sagikazar@gmail.com>
Signed-off-by: Mark Sagi-Kazar <mark.sagikazar@gmail.com>
@sagikazarmark sagikazarmark requested a review from Copilot January 12, 2026 17:12
Signed-off-by: Mark Sagi-Kazar <mark.sagikazar@gmail.com>
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This pull request adds an Unmarshaler interface to mapstructure, allowing types to define custom unmarshaling behavior similar to json.Unmarshaler from the standard library. This is a follow-up to previous PRs (#11, #155, #164) with improved edge case handling and test quality.

Changes:

  • Added Unmarshaler interface with UnmarshalMapstructure(any) error method
  • Integrated Unmarshaler check into the decode flow (runs after DecodeHook but before standard decoding)
  • Added DisableUnmarshaler config option to opt out of Unmarshaler behavior
  • Comprehensive test coverage including nested structs, embedding, non-struct types, error handling, and interaction with DecodeHook
  • Added example demonstrating default value application via Unmarshaler

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

File Description
mapstructure.go Core implementation: defines Unmarshaler interface, adds DisableUnmarshaler config option, implements getUnmarshaler helper, and integrates Unmarshaler check into decode flow
mapstructure_test.go Comprehensive test suite covering basic usage, DecodeHook interaction, disable flag, nested structs, embedding, error handling, pointer receivers, non-struct types (string, slice, map), metadata, and struct-to-map decoding
mapstructure_examples_test.go Example demonstrating Unmarshaler interface usage for applying default values

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread mapstructure_test.go
Comment thread mapstructure_test.go
@sagikazarmark sagikazarmark merged commit 9aa3f77 into main Jan 12, 2026
11 checks passed
@sagikazarmark sagikazarmark deleted the unmarshal2 branch January 12, 2026 17:24
radermacher-iits pushed a commit to kubara-io/kubara that referenced this pull request Feb 19, 2026
…5.0 (#232)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [github.com/go-viper/mapstructure/v2](https://github.com/go-viper/mapstructure) | require | minor | `v2.4.0` → `v2.5.0` |

---

### Release Notes

<details>
<summary>go-viper/mapstructure (github.com/go-viper/mapstructure/v2)</summary>

### [`v2.5.0`](https://github.com/go-viper/mapstructure/releases/tag/v2.5.0)

[Compare Source](go-viper/mapstructure@v2.4.0...v2.5.0)

#### What's Changed

- Print qualified type name when ErrorUnused=true causes errors for unused keys in embedded fields by [@&#8203;jmacd](https://github.com/jmacd) in [#&#8203;113](go-viper/mapstructure#113)
- build(deps): bump github/codeql-action from 3.29.2 to 3.29.5 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;126](go-viper/mapstructure#126)
- build(deps): bump github/codeql-action from 3.29.7 to 3.29.10 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;131](go-viper/mapstructure#131)
- build(deps): bump actions/checkout from 4.2.2 to 5.0.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;129](go-viper/mapstructure#129)
- feat: support for automatically initializing squashed pointer structs by [@&#8203;tuunit](https://github.com/tuunit) in [#&#8203;71](go-viper/mapstructure#71)
- build(deps): bump actions/setup-go from 5.5.0 to 6.0.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;134](go-viper/mapstructure#134)
- build(deps): bump ossf/scorecard-action from 2.4.2 to 2.4.3 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;142](go-viper/mapstructure#142)
- Fix slice deep map (owned) by [@&#8203;jphastings](https://github.com/jphastings) in [#&#8203;144](go-viper/mapstructure#144)
- chore: fix lint violations by [@&#8203;sagikazarmark](https://github.com/sagikazarmark) in [#&#8203;157](go-viper/mapstructure#157)
- chore: switch to devenv by [@&#8203;sagikazarmark](https://github.com/sagikazarmark) in [#&#8203;158](go-viper/mapstructure#158)
- build(deps): bump actions/upload-artifact from 4.6.2 to 5.0.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;151](go-viper/mapstructure#151)
- build(deps): bump github/codeql-action from 3.29.10 to 4.31.2 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;153](go-viper/mapstructure#153)
- build(deps): bump golangci/golangci-lint-action from 8.0.0 to 9.0.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;154](go-viper/mapstructure#154)
- build(deps): bump actions/checkout from 5.0.0 to 6.0.1 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;160](go-viper/mapstructure#160)
- build(deps): bump actions/setup-go from 6.0.0 to 6.1.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;159](go-viper/mapstructure#159)
- build(deps): bump github/codeql-action from 4.31.7 to 4.31.8 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;162](go-viper/mapstructure#162)
- build(deps): bump actions/upload-artifact from 5.0.0 to 6.0.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;161](go-viper/mapstructure#161)
- build(deps): bump github/codeql-action from 4.31.8 to 4.31.9 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;163](go-viper/mapstructure#163)
- feature: Add map field name to convert structs dynamically instead of individually with a tag. by [@&#8203;thespags](https://github.com/thespags) in [#&#8203;149](go-viper/mapstructure#149)
- feat(decoder): support multiple tag names in order by [@&#8203;DarkiT](https://github.com/DarkiT) in [#&#8203;59](go-viper/mapstructure#59)
- feat: optional root object name by [@&#8203;andreev-fn](https://github.com/andreev-fn) in [#&#8203;137](go-viper/mapstructure#137)
- Add unmarshaler interface by [@&#8203;sagikazarmark](https://github.com/sagikazarmark) in [#&#8203;166](go-viper/mapstructure#166)

#### New Contributors

- [@&#8203;jmacd](https://github.com/jmacd) made their first contribution in [#&#8203;113](go-viper/mapstructure#113)
- [@&#8203;tuunit](https://github.com/tuunit) made their first contribution in [#&#8203;71](go-viper/mapstructure#71)
- [@&#8203;jphastings](https://github.com/jphastings) made their first contribution in [#&#8203;144](go-viper/mapstructure#144)
- [@&#8203;thespags](https://github.com/thespags) made their first contribution in [#&#8203;149](go-viper/mapstructure#149)
- [@&#8203;DarkiT](https://github.com/DarkiT) made their first contribution in [#&#8203;59](go-viper/mapstructure#59)
- [@&#8203;andreev-fn](https://github.com/andreev-fn) made their first contribution in [#&#8203;137](go-viper/mapstructure#137)

**Full Changelog**: <go-viper/mapstructure@v2.4.0...v2.5.0>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44MC4xIiwidXBkYXRlZEluVmVyIjoiNDIuODAuMSIsInRhcmdldEJyYW5jaCI6Im1hc3RlciIsImxhYmVscyI6W119-->

Reviewed-on: https://kubara.git.onstackit.cloud/STACKIT/kubara/pulls/232
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants