1package bug
2
3import (
4 "encoding/json"
5 "fmt"
6
7 "github.com/MichaelMure/git-bug/entity"
8 "github.com/MichaelMure/git-bug/entity/dag"
9)
10
11const (
12 _ entity.OperationType = iota
13 CreateOp
14 SetTitleOp
15 AddCommentOp
16 SetStatusOp
17 LabelChangeOp
18 EditCommentOp
19 NoOpOp
20 SetMetadataOp
21)
22
23// Operation define the interface to fulfill for an edit operation of a Bug
24type Operation = dag.OperationWithApply[*Snapshot]
25
26// make sure that package external operations do conform to our interface
27var _ Operation = &dag.NoOpOperation[*Snapshot]{}
28var _ Operation = &dag.SetMetadataOperation[*Snapshot]{}
29
30func operationUnmarshaler(raw json.RawMessage, resolvers entity.Resolvers) (dag.Operation, error) {
31 var t struct {
32 OperationType entity.OperationType `json:"type"`
33 }
34
35 if err := json.Unmarshal(raw, &t); err != nil {
36 return nil, err
37 }
38
39 var op dag.Operation
40
41 switch t.OperationType {
42 case AddCommentOp:
43 op = &AddCommentOperation{}
44 case CreateOp:
45 op = &CreateOperation{}
46 case EditCommentOp:
47 op = &EditCommentOperation{}
48 case LabelChangeOp:
49 op = &LabelChangeOperation{}
50 case NoOpOp:
51 op = &dag.NoOpOperation[*Snapshot]{}
52 case SetMetadataOp:
53 op = &dag.SetMetadataOperation[*Snapshot]{}
54 case SetStatusOp:
55 op = &SetStatusOperation{}
56 case SetTitleOp:
57 op = &SetTitleOperation{}
58 default:
59 panic(fmt.Sprintf("unknown operation type %v", t.OperationType))
60 }
61
62 err := json.Unmarshal(raw, &op)
63 if err != nil {
64 return nil, err
65 }
66
67 return op, nil
68}