Skip to content

Add #[cbor(text_keys)] for automatic string-keyed map encoding#57

Open
ropuls wants to merge 3 commits into
twittner:str-indexfrom
ropuls:feature/text-keys
Open

Add #[cbor(text_keys)] for automatic string-keyed map encoding#57
ropuls wants to merge 3 commits into
twittner:str-indexfrom
ropuls:feature/text-keys

Conversation

@ropuls

@ropuls ropuls commented Mar 14, 2026

Copy link
Copy Markdown

Build on top of the #[s("...")] string index support to add a struct/enum-level #[cbor(text_keys)] attribute that automatically uses field/variant names as string keys, removing the need to annotate every field individually.

Features:

  • #[cbor(text_keys)] on structs: all fields auto-keyed by name
  • #[cbor(text_keys)] on enums: all variants auto-keyed by name
  • #[cbor(key = "...")] for custom wire key names (per field/variant)
  • text_keys implies map encoding automatically
  • Unit enum variants encode as naked strings ("Reset")
  • Non-unit enum variants encode as map(1) {"Name": {fields}}

Also fixes:

  • Add missing s attribute to CborLen proc_macro_derive

Validation:

  • text_keys on tuple/unit structs: compile error
  • text_keys + transparent / index_only: compile error
  • #[cbor(key = "...")] without text_keys: compile error
  • Duplicate key names: compile error

Tests: 40 host tests + 36 STM32H563ZI (Cortex-M33) no_std tests

ropuls added 3 commits March 15, 2026 15:10
Build on top of the #[s("...")] string index support to add a
struct/enum-level #[cbor(text_keys)] attribute that automatically
uses field/variant names as string keys, removing the need to
annotate every field individually.

Features:
- #[cbor(text_keys)] on structs: all fields auto-keyed by name
- #[cbor(text_keys)] on enums: all variants auto-keyed by name
- #[cbor(key = "...")] for custom wire key names (per field/variant)
- text_keys implies map encoding automatically
- Unit enum variants encode as naked strings ("Reset")
- Non-unit enum variants encode as map(1) {"Name": {fields}}

Also fixes:
- Add missing `s` attribute to CborLen proc_macro_derive

Validation:
- text_keys on tuple/unit structs: compile error
- text_keys + transparent / index_only: compile error
- #[cbor(key = "...")] without text_keys: compile error
- Duplicate key names: compile error

Tests: 40 host tests + 36 STM32H563ZI (Cortex-M33) no_std tests
Signed-off-by: Roman Puls <ropuls@users.noreply.github.com>
Signed-off-by: Roman Puls <ropuls@users.noreply.github.com>
Signed-off-by: Roman Puls <ropuls@users.noreply.github.com>
@ropuls
ropuls force-pushed the feature/text-keys branch from 3e55890 to 0f0848c Compare March 15, 2026 14:11
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.

1 participant