diff --git a/example/shirtsize_jsonenums.go b/example/shirtsize_jsonenums.go index a2432d6..65ac8ad 100644 --- a/example/shirtsize_jsonenums.go +++ b/example/shirtsize_jsonenums.go @@ -7,34 +7,23 @@ import ( "fmt" ) -func (r ShirtSize) String() string { - switch r { - - case NA: - return "NA" - - case XS: - return "XS" - - case S: - return "S" - - case M: - return "M" - - case L: - return "L" - - case XL: - return "XL" - - default: - return "unknown ShirtSize" - } +var _ShirtSizeValueToName = map[ShirtSize]string{ + NA: "NA", XS: "XS", S: "S", M: "M", L: "L", XL: "XL", } func (r ShirtSize) MarshalJSON() ([]byte, error) { - return json.Marshal(r.String()) + if s, ok := r.(fmt.Stringer); ok { + return json.Marshal(s.String()) + } + s, ok := _ShirtSizeValueToName[r] + if !ok { + return nil, fmt.Errorf("invalid ShirtSize: %d", r) + } + return json.Marshal(s) +} + +var _ShirtSizeNameToValue = map[string]ShirtSize{ + "NA": NA, "XS": XS, "S": S, "M": M, "L": L, "XL": XL, } func (r *ShirtSize) UnmarshalJSON(data []byte) error { @@ -42,28 +31,10 @@ func (r *ShirtSize) UnmarshalJSON(data []byte) error { if err := json.Unmarshal(data, &s); err != nil { return fmt.Errorf("ShirtSize should be a string, got %s", data) } - switch s { - - case "NA": - *r = NA - - case "XS": - *r = XS - - case "S": - *r = S - - case "M": - *r = M - - case "L": - *r = L - - case "XL": - *r = XL - - default: + v, ok := _ShirtSizeNameToValue[s] + if !ok { return fmt.Errorf("invalid ShirtSize %q", s) } + *r = v return nil } diff --git a/example/weekday_jsonenums.go b/example/weekday_jsonenums.go index 38b923f..5e6f0b5 100644 --- a/example/weekday_jsonenums.go +++ b/example/weekday_jsonenums.go @@ -7,37 +7,23 @@ import ( "fmt" ) -func (r WeekDay) String() string { - switch r { - - case Monday: - return "Monday" - - case Tuesday: - return "Tuesday" - - case Wednesday: - return "Wednesday" - - case Thursday: - return "Thursday" - - case Friday: - return "Friday" - - case Saturday: - return "Saturday" - - case Sunday: - return "Sunday" - - default: - return "unknown WeekDay" - } +var _WeekDayValueToName = map[WeekDay]string{ + Monday: "Monday", Tuesday: "Tuesday", Wednesday: "Wednesday", Thursday: "Thursday", Friday: "Friday", Saturday: "Saturday", Sunday: "Sunday", } func (r WeekDay) MarshalJSON() ([]byte, error) { - return json.Marshal(r.String()) + if s, ok := r.(fmt.Stringer); ok { + return json.Marshal(s.String()) + } + s, ok := _WeekDayValueToName[r] + if !ok { + return nil, fmt.Errorf("invalid WeekDay: %d", r) + } + return json.Marshal(s) +} + +var _WeekDayNameToValue = map[string]WeekDay{ + "Monday": Monday, "Tuesday": Tuesday, "Wednesday": Wednesday, "Thursday": Thursday, "Friday": Friday, "Saturday": Saturday, "Sunday": Sunday, } func (r *WeekDay) UnmarshalJSON(data []byte) error { @@ -45,31 +31,10 @@ func (r *WeekDay) UnmarshalJSON(data []byte) error { if err := json.Unmarshal(data, &s); err != nil { return fmt.Errorf("WeekDay should be a string, got %s", data) } - switch s { - - case "Monday": - *r = Monday - - case "Tuesday": - *r = Tuesday - - case "Wednesday": - *r = Wednesday - - case "Thursday": - *r = Thursday - - case "Friday": - *r = Friday - - case "Saturday": - *r = Saturday - - case "Sunday": - *r = Sunday - - default: + v, ok := _WeekDayNameToValue[s] + if !ok { return fmt.Errorf("invalid WeekDay %q", s) } + *r = v return nil } diff --git a/template.go b/template.go index 243d01a..e2ca209 100644 --- a/template.go +++ b/template.go @@ -19,19 +19,23 @@ import ( ) {{range $typename, $values := .TypesAndValues}} -func (r {{$typename}}) String() string { - switch r { - {{range $values}} - case {{.}}: - return "{{.}}" - {{end}} - default: - return "unknown {{$typename}}" - } +var _{{$typename}}ValueToName = map[{{$typename}}]string { + {{range $values}}{{.}}: "{{.}}",{{end}} } func (r {{$typename}}) MarshalJSON() ([]byte, error) { - return json.Marshal(r.String()) + if s, ok := r.(fmt.Stringer); ok { + return json.Marshal(s.String()) + } + s, ok := _{{$typename}}ValueToName[r] + if !ok { + return nil, fmt.Errorf("invalid {{$typename}}: %d", r) + } + return json.Marshal(s) +} + +var _{{$typename}}NameToValue = map[string]{{$typename}} { + {{range $values}}"{{.}}": {{.}},{{end}} } func (r *{{$typename}}) UnmarshalJSON(data []byte) error { @@ -39,14 +43,11 @@ func (r *{{$typename}}) UnmarshalJSON(data []byte) error { if err := json.Unmarshal(data, &s); err != nil { return fmt.Errorf("{{$typename}} should be a string, got %s", data) } - switch s { - {{range $values}} - case "{{.}}": - *r = {{.}} - {{end}} - default: + v, ok := _{{$typename}}NameToValue[s] + if !ok { return fmt.Errorf("invalid {{$typename}} %q", s) } + *r = v return nil }