diff options
Diffstat (limited to 'entities/bug/with_snapshot.go')
-rw-r--r-- | entities/bug/with_snapshot.go | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/entities/bug/with_snapshot.go b/entities/bug/with_snapshot.go new file mode 100644 index 00000000..0474cac7 --- /dev/null +++ b/entities/bug/with_snapshot.go @@ -0,0 +1,53 @@ +package bug + +import ( + "github.com/MichaelMure/git-bug/repository" +) + +var _ Interface = &WithSnapshot{} + +// WithSnapshot encapsulate a Bug and maintain the corresponding Snapshot efficiently +type WithSnapshot struct { + *Bug + snap *Snapshot +} + +func (b *WithSnapshot) Compile() *Snapshot { + if b.snap == nil { + snap := b.Bug.Compile() + b.snap = snap + } + return b.snap +} + +// Append intercept Bug.Append() to update the snapshot efficiently +func (b *WithSnapshot) Append(op Operation) { + b.Bug.Append(op) + + if b.snap == nil { + return + } + + op.Apply(b.snap) + b.snap.Operations = append(b.snap.Operations, op) +} + +// Commit intercept Bug.Commit() to update the snapshot efficiently +func (b *WithSnapshot) Commit(repo repository.ClockedRepo) error { + err := b.Bug.Commit(repo) + + if err != nil { + b.snap = nil + return err + } + + // Commit() shouldn't change anything of the bug state apart from the + // initial ID set + + if b.snap == nil { + return nil + } + + b.snap.id = b.Bug.Id() + return nil +} |