Skip to content

Repository files navigation

enumtag Build StatusGoDoc

Package enumtag provides a type-directed mechanism to encode arbitrary tagged enums as JSON.

Check out the package documentation for details.

typeItemAddedstruct {
ItemIDstring`json:"item_id"`Quantityint`json:"quantity"`
}
typeItemRemovedstruct {
ItemIDstring`json:"item_id"`Quantityint`json:"quantity"`
}
typeCheckoutstruct{}
typeShoppingCartEventstruct {
Valueinterface{} `enumvaluefield:"value"`Variants [0]*struct {
ItemAdded`enumtag:"item_added"`ItemRemoved`enumtag:"item_removed"`Checkout`enumtag:"checkout"`
} `enumtagfield:"type"`
}
func (eShoppingCartEvent) MarshalJSON() ([]byte, error) {
returnenumtag.MarshalJSON(e)
}
func (e*ShoppingCartEvent) UnmarshalJSON(data []byte) error {
returnenumtag.UnmarshalJSON(data, e)
}
for_, jsonEvent:=range []string{
`{"type": "item_removed", "value": {"item_id": "foo", "quantity": 2}}`,
`{"type": "checkout"}`,
`{"type": "item_added", "value": {"item_id": "xyz", "quantity": 5}}`,
} {
vareventShoppingCartEventerr:=json.Unmarshal([]byte(jsonEvent), &event)
iferr!=nil {
panic(err)
}
// Which event did we get? Let's see.switche:=event.Value.(type) {
caseItemAdded:
fmt.Printf("Got ItemAdded; item ID: %v; quantity: %v\n", e.ItemID, e.Quantity)
caseItemRemoved:
fmt.Printf("Got ItemRemoved; item ID: %v; quantity: %v\n", e.ItemID, e.Quantity)
caseCheckout:
fmt.Println("Got Checkout")
}
}
// Output:// Got ItemRemoved; item ID: foo; quantity: 2// Got Checkout// Got ItemAdded; item ID: xyz; quantity: 5

About

Package enumtag provides a type-directed mechanism to encode arbitrary tagged enums as JSON.

Resources

Stars

6 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages