op_set_metadata.go

 1package bug
 2
 3import (
 4	"github.com/MichaelMure/git-bug/identity"
 5	"github.com/MichaelMure/git-bug/util/git"
 6)
 7
 8var _ Operation = &SetMetadataOperation{}
 9
10type SetMetadataOperation struct {
11	OpBase
12	Target      git.Hash          `json:"target"`
13	NewMetadata map[string]string `json:"new_metadata"`
14}
15
16func (op *SetMetadataOperation) base() *OpBase {
17	return &op.OpBase
18}
19
20func (op *SetMetadataOperation) Hash() (git.Hash, error) {
21	return hashOperation(op)
22}
23
24func (op *SetMetadataOperation) Apply(snapshot *Snapshot) {
25	for _, target := range snapshot.Operations {
26		hash, err := target.Hash()
27		if err != nil {
28			// Should never error unless a programming error happened
29			// (covered in OpBase.Validate())
30			panic(err)
31		}
32
33		if hash == op.Target {
34			base := target.base()
35
36			if base.extraMetadata == nil {
37				base.extraMetadata = make(map[string]string)
38			}
39
40			for key, val := range op.NewMetadata {
41				if _, exist := base.extraMetadata[key]; !exist {
42					base.extraMetadata[key] = val
43				}
44			}
45
46			return
47		}
48	}
49}
50
51func (op *SetMetadataOperation) Validate() error {
52	if err := opBaseValidate(op, SetMetadataOp); err != nil {
53		return err
54	}
55
56	return nil
57}
58
59// Sign post method for gqlgen
60func (op *SetMetadataOperation) IsAuthored() {}
61
62func NewSetMetadataOp(author identity.Interface, unixTime int64, target git.Hash, newMetadata map[string]string) *SetMetadataOperation {
63	return &SetMetadataOperation{
64		OpBase:      newOpBase(SetMetadataOp, author, unixTime),
65		Target:      target,
66		NewMetadata: newMetadata,
67	}
68}
69
70// Convenience function to apply the operation
71func SetMetadata(b Interface, author identity.Interface, unixTime int64, target git.Hash, newMetadata map[string]string) (*SetMetadataOperation, error) {
72	SetMetadataOp := NewSetMetadataOp(author, unixTime, target, newMetadata)
73	if err := SetMetadataOp.Validate(); err != nil {
74		return nil, err
75	}
76	b.Append(SetMetadataOp)
77	return SetMetadataOp, nil
78}