any-sync/acltree/acltree.go
2022-07-08 12:31:06 +02:00

152 lines
3.3 KiB
Go

package acltree
import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/account"
"github.com/anytypeio/go-anytype-infrastructure-experiments/thread"
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys"
)
type AddResultSummary int
const (
AddResultSummaryNothing AddResultSummary = iota
AddResultSummaryAppend
AddResultSummaryRebuild
)
type AddResult struct {
AttachedChanges []*Change
InvalidChanges []*Change
UnattachedChanges []*Change
Summary AddResultSummary
}
type ACLTree interface {
ACLState() *ACLState
AddContent(changeContent *ChangeContent) (*Change, error)
AddChanges(changes ...*Change) (AddResult, error) // TODO: Make change as interface
Heads() []string
Iterate(func(change *Change) bool)
IterateFrom(string, func(change *Change) bool)
HasChange(change *Change) bool
}
type aclTree struct {
thread thread.Thread
accountData *account.AccountData
fullTree *Tree
aclState *ACLState
treeBuilder *treeBuilder
aclTreeBuilder *aclTreeBuilder
aclStateBuilder *aclStateBuilder
snapshotValidator *snapshotValidator
}
func BuildACLTree(t thread.Thread, acc *account.AccountData) (ACLTree, error) {
decoder := keys.NewEd25519Decoder()
aclTreeBuilder := newACLTreeBuilder(t, decoder)
treeBuilder := newTreeBuilder(t, decoder)
snapshotValidator := newSnapshotValidator(decoder, acc)
aclStateBuilder := newACLStateBuilder(decoder, acc)
aclTree := &aclTree{
thread: t,
accountData: acc,
fullTree: nil,
aclState: nil,
treeBuilder: treeBuilder,
aclTreeBuilder: aclTreeBuilder,
aclStateBuilder: aclStateBuilder,
snapshotValidator: snapshotValidator,
}
err := aclTree.rebuildFromThread(false)
if err != nil {
return nil, err
}
return aclTree, nil
}
func (a *aclTree) rebuildFromThread(fromStart bool) error {
var aclTree *Tree
a.treeBuilder.init()
a.aclTreeBuilder.init()
var err error
a.fullTree, err = a.treeBuilder.build(fromStart)
if err != nil {
return err
}
// TODO: remove this from context as this is used only to validate snapshot
aclTree, err = a.aclTreeBuilder.build()
if err != nil {
return err
}
if !fromStart {
err = a.snapshotValidator.init(aclTree)
if err != nil {
return err
}
valid, err := a.snapshotValidator.validateSnapshot(a.fullTree.root)
if err != nil {
return err
}
if !valid {
return a.rebuildFromThread(true)
}
}
err = a.aclStateBuilder.init(a.fullTree)
if err != nil {
return err
}
a.aclState, err = a.aclStateBuilder.build()
if err != nil {
return err
}
return nil
}
func (a *aclTree) ACLState() *ACLState {
//TODO implement me
panic("implement me")
}
func (a *aclTree) AddContent(changeContent *ChangeContent) (*Change, error) {
//TODO implement me
panic("implement me")
}
func (a *aclTree) AddChanges(changes ...*Change) (AddResult, error) {
//TODO implement me
panic("implement me")
}
func (a *aclTree) Heads() []string {
//TODO implement me
panic("implement me")
}
func (a *aclTree) Iterate(f func(change *Change) bool) {
//TODO implement me
panic("implement me")
}
func (a *aclTree) IterateFrom(s string, f func(change *Change) bool) {
//TODO implement me
panic("implement me")
}
func (a *aclTree) HasChange(change *Change) bool {
//TODO implement me
panic("implement me")
}