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}