Skip to content

Instantly share code, notes, and snippets.

@smiley-yoyo
Forked from lummie/enum.go
Last active February 16, 2022 09:12
Show Gist options
  • Select an option

  • Save smiley-yoyo/671b63c0a34989158f8f7fe69fd30a9d to your computer and use it in GitHub Desktop.

Select an option

Save smiley-yoyo/671b63c0a34989158f8f7fe69fd30a9d to your computer and use it in GitHub Desktop.
Golang Enum pattern that can be serialized to json
package enum_example
import (
"bytes"
"encoding/json"
)
// TaskState represents the state of task, moving through Created, Running then Finished or Errorred
type TaskState int
const (
// Created represents the task has been created but not started yet
Created TaskState = iota
//Running represents the task has started
Running
// Finished represents the task is complete
Finished
// Errorred represents the task has encountered a problem and is no longer running
Errorred
)
func (s TaskState) String() string {
return toString[s]
}
var toString = map[TaskState]string{
Created: "Created",
Running: "Running",
Finished: "Finished",
Errorred: "Errorred",
}
var toID = map[string]TaskState{
"Created": Created,
"Running": Running,
"Finished": Finished,
"Errorred": Errorred,
}
// MarshalJSON marshals the enum as a quoted json string
func (s TaskState) MarshalJSON() ([]byte, error) {
buffer := bytes.NewBufferString(`"`)
buffer.WriteString(toString[s])
buffer.WriteString(`"`)
return buffer.Bytes(), nil
}
// UnmarshalJSON unmashals a quoted json string to the enum value
func (s *TaskState) UnmarshalJSON(b []byte) error {
var j string
err := json.Unmarshal(b, &j)
if err != nil {
return err
}
// Note that if the string cannot be found then it will be set to the zero value, 'Created' in this case.
*s = toID[j]
return nil
}
// another options
type Kind int
const (
Sent Kind = iota
Received
Failed
Report
)
func (t Kind) String() string {
return [...]string{"Sent", "Received", "Failed", "Report"}[t]
}
func (t *Kind) FromString(kind string) Kind {
return map[string]Kind{
"Sent": Sent,
"Received": Received,
"Failed": Failed,
"Report": Report,
}[kind]
}
func (t Kind) MarshalJSON() ([]byte, error) {
return json.Marshal(t.String())
}
func (t *Kind) UnMarshalJSON(b []byte) error {
var s string
err := json.Unmarshal(b, &s)
if err != nil {
return err
}
*t = t.FromString(s)
return nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment