From 43dbdd8d68f939f95f78f4931ab0538b6cb84681 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sun, 3 Jul 2022 17:51:14 +0200 Subject: [PATCH] Add plain text document state --- data/plaintextdocstate.go | 61 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 data/plaintextdocstate.go diff --git a/data/plaintextdocstate.go b/data/plaintextdocstate.go new file mode 100644 index 00000000..d661d635 --- /dev/null +++ b/data/plaintextdocstate.go @@ -0,0 +1,61 @@ +package data + +import ( + "fmt" + + "github.com/anytypeio/go-anytype-infrastructure-experiments/data/pb" + "github.com/gogo/protobuf/proto" +) + +type PlainTextDocumentState struct { + LastChangeId string + Text string +} + +func NewPlainTextDocumentState(text string, id string) *PlainTextDocumentState { + return &PlainTextDocumentState{ + LastChangeId: id, + Text: text, + } +} + +func (p *PlainTextDocumentState) ApplyChange(change []byte, id string) (DocumentState, error) { + var changesData pb.PlainTextChangeData + err := proto.Unmarshal(change, &changesData) + if err != nil { + return nil, err + } + + for _, content := range changesData.GetContent() { + err = p.applyChange(content) + if err != nil { + return nil, err + } + } + p.LastChangeId = id + return p, nil +} + +func (p *PlainTextDocumentState) applyChange(ch *pb.PlainTextChangeContent) error { + switch { + case ch.GetTextAppend() != nil: + text := ch.GetTextAppend().GetText() + p.Text += text + } + return nil +} + +type PlainTextDocumentStateProvider struct{} + +func (p *PlainTextDocumentStateProvider) ProvideFromInitialChange(change []byte, id string) (DocumentState, error) { + var changesData pb.PlainTextChangeData + err := proto.Unmarshal(change, &changesData) + if err != nil { + return nil, err + } + + if changesData.GetSnapshot() == nil { + return nil, fmt.Errorf("could not create state from empty snapshot") + } + return NewPlainTextDocumentState(changesData.GetSnapshot().GetText(), id), nil +}