status.go

 1package bug
 2
 3import (
 4	"fmt"
 5	"io"
 6	"strconv"
 7	"strings"
 8)
 9
10type Status int
11
12const (
13	_ Status = iota
14	OpenStatus
15	ClosedStatus
16)
17
18func (s Status) String() string {
19	switch s {
20	case OpenStatus:
21		return "open"
22	case ClosedStatus:
23		return "closed"
24	default:
25		return "unknown status"
26	}
27}
28
29func (s Status) Action() string {
30	switch s {
31	case OpenStatus:
32		return "opened"
33	case ClosedStatus:
34		return "closed"
35	default:
36		return "unknown status"
37	}
38}
39
40func StatusFromString(str string) (Status, error) {
41	cleaned := strings.ToLower(strings.TrimSpace(str))
42
43	switch cleaned {
44	case "open":
45		return OpenStatus, nil
46	case "closed":
47		return ClosedStatus, nil
48	default:
49		return 0, fmt.Errorf("unknown status")
50	}
51}
52
53func (s Status) Validate() error {
54	if s != OpenStatus && s != ClosedStatus {
55		return fmt.Errorf("invalid")
56	}
57
58	return nil
59}
60
61func (s Status) MarshalGQL(w io.Writer) {
62	switch s {
63	case OpenStatus:
64		_, _ = fmt.Fprintf(w, strconv.Quote("OPEN"))
65	case ClosedStatus:
66		_, _ = fmt.Fprintf(w, strconv.Quote("CLOSED"))
67	default:
68		panic("missing case")
69	}
70}
71
72func (s *Status) UnmarshalGQL(v interface{}) error {
73	str, ok := v.(string)
74	if !ok {
75		return fmt.Errorf("enums must be strings")
76	}
77	switch str {
78	case "OPEN":
79		*s = OpenStatus
80	case "CLOSED":
81		*s = ClosedStatus
82	default:
83		return fmt.Errorf("%s is not a valid Status", str)
84	}
85	return nil
86}