operation.go

 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}