Fix threadbuilder and change examples
This commit is contained in:
parent
1a1883d79a
commit
fefbdbd764
@ -14,8 +14,7 @@ changes:
|
|||||||
encryptedReadKeys: [key.Read.1]
|
encryptedReadKeys: [key.Read.1]
|
||||||
permission: admin
|
permission: admin
|
||||||
snapshot:
|
snapshot:
|
||||||
blocks:
|
text: "some text"
|
||||||
- id: root
|
|
||||||
aclChanges:
|
aclChanges:
|
||||||
- userAdd:
|
- userAdd:
|
||||||
identity: A
|
identity: A
|
||||||
@ -45,8 +44,7 @@ changes:
|
|||||||
encryptedReadKeys: [ key.Read.1 ]
|
encryptedReadKeys: [ key.Read.1 ]
|
||||||
permission: admin
|
permission: admin
|
||||||
snapshot:
|
snapshot:
|
||||||
blocks:
|
text: "some text"
|
||||||
- id: root
|
|
||||||
aclChanges:
|
aclChanges:
|
||||||
- userAdd:
|
- userAdd:
|
||||||
identity: D
|
identity: D
|
||||||
|
|||||||
@ -126,7 +126,7 @@ func (t *ThreadBuilder) Parse(thread *YMLThread) {
|
|||||||
newChange.readKey = k
|
newChange.readKey = k
|
||||||
newChange.signKey = t.keychain.SigningKeys[ch.Identity]
|
newChange.signKey = t.keychain.SigningKeys[ch.Identity]
|
||||||
aclChange := &pb.ACLChange{}
|
aclChange := &pb.ACLChange{}
|
||||||
aclChange.Identity = newChange.Identity
|
aclChange.Identity = ch.Identity
|
||||||
if len(ch.AclChanges) > 0 || ch.AclSnapshot != nil {
|
if len(ch.AclChanges) > 0 || ch.AclSnapshot != nil {
|
||||||
aclChange.AclData = &pb.ACLChangeACLData{}
|
aclChange.AclData = &pb.ACLChangeACLData{}
|
||||||
if ch.AclSnapshot != nil {
|
if ch.AclSnapshot != nil {
|
||||||
@ -368,7 +368,8 @@ func (t *ThreadBuilder) convertPermission(perm string) pb.ACLChangeUserPermissio
|
|||||||
|
|
||||||
func (t *ThreadBuilder) traverseFromHeads(f func(t *threadChange) error) error {
|
func (t *ThreadBuilder) traverseFromHeads(f func(t *threadChange) error) error {
|
||||||
uniqMap := map[string]struct{}{}
|
uniqMap := map[string]struct{}{}
|
||||||
stack := t.heads
|
stack := make([]string, len(t.heads), 10)
|
||||||
|
copy(stack, t.heads)
|
||||||
for len(stack) > 0 {
|
for len(stack) > 0 {
|
||||||
id := stack[len(stack)-1]
|
id := stack[len(stack)-1]
|
||||||
stack = stack[:len(stack)-1]
|
stack = stack[:len(stack)-1]
|
||||||
|
|||||||
@ -1,75 +1,68 @@
|
|||||||
thread:
|
thread:
|
||||||
author: A
|
author: A
|
||||||
logs:
|
changes:
|
||||||
- id: A.1
|
- id: A.1.1
|
||||||
identity: A
|
identity: A
|
||||||
records:
|
aclSnapshot:
|
||||||
- id: A.1.1
|
userStates:
|
||||||
aclSnapshot:
|
- identity: A
|
||||||
userStates:
|
encryptionKey: key.Enc.A
|
||||||
- identity: A
|
encryptedReadKeys: [key.Read.1]
|
||||||
encryptionKey: key.Enc.A
|
permission: admin
|
||||||
encryptedReadKeys: [key.Read.1]
|
snapshot:
|
||||||
permission: admin
|
text: "some text"
|
||||||
snapshot:
|
aclChanges:
|
||||||
blocks:
|
- userAdd:
|
||||||
- id: root
|
identity: A
|
||||||
aclChanges:
|
permission: admin
|
||||||
- userAdd:
|
encryptionKey: key.Enc.A
|
||||||
identity: A
|
encryptedReadKeys: [key.Read.1]
|
||||||
permission: admin
|
changes:
|
||||||
encryptionKey: key.Enc.A
|
- textAppend:
|
||||||
encryptedReadKeys: [key.Read.1]
|
text: "some text"
|
||||||
changes:
|
readKey: key.Read.1
|
||||||
- blockAdd:
|
- id: A.1.2
|
||||||
id: root
|
identity: A
|
||||||
readKey: key.Read.1
|
aclChanges:
|
||||||
- id: A.1.2
|
- userInvite:
|
||||||
aclChanges:
|
acceptKey: key.Sign.Onetime1
|
||||||
- userInvite:
|
encryptionKey: key.Enc.Onetime1
|
||||||
acceptKey: key.Sign.Onetime1
|
encryptedReadKeys: [key.Read.1]
|
||||||
encryptionKey: key.Enc.Onetime1
|
permissions: writer
|
||||||
encryptedReadKeys: [key.Read.1]
|
- userAdd:
|
||||||
permissions: writer
|
identity: C
|
||||||
- userAdd:
|
permission: reader
|
||||||
identity: C
|
encryptionKey: key.Enc.C
|
||||||
permission: reader
|
encryptedReadKeys: [ key.Read.1 ]
|
||||||
encryptionKey: key.Enc.C
|
readKey: key.Read.1
|
||||||
encryptedReadKeys: [ key.Read.1 ]
|
- id: A.1.3
|
||||||
readKey: key.Read.1
|
identity: A
|
||||||
- id: A.1.3
|
changes:
|
||||||
changes:
|
- textAppend:
|
||||||
- blockAdd:
|
text: "second"
|
||||||
id: second
|
readKey: key.Read.1
|
||||||
targetId: root
|
- id: B.1.1
|
||||||
readKey: key.Read.1
|
|
||||||
- id: B.1
|
|
||||||
identity: B
|
identity: B
|
||||||
records:
|
aclChanges:
|
||||||
- id: B.1.1
|
- userJoin:
|
||||||
aclChanges:
|
identity: B
|
||||||
- userJoin:
|
encryptionKey: key.Enc.B
|
||||||
identity: B
|
acceptSignature: key.Sign.Onetime1
|
||||||
encryptionKey: key.Enc.B
|
inviteId: A.1.2
|
||||||
acceptSignature: key.Sign.Onetime1
|
encryptedReadKeys: [key.Read.1]
|
||||||
inviteId: A.1.2
|
readKey: key.Read.1
|
||||||
encryptedReadKeys: [key.Read.1]
|
- id: B.1.2
|
||||||
readKey: key.Read.1
|
identity: B
|
||||||
- id: B.1.2
|
changes:
|
||||||
changes:
|
- textAppend:
|
||||||
- blockAdd:
|
text: "first"
|
||||||
id: first
|
readKey: key.Read.1
|
||||||
targetId: root
|
- id: C.1.1
|
||||||
readKey: key.Read.1
|
|
||||||
- id: C.1
|
|
||||||
identity: C
|
identity: C
|
||||||
records:
|
changes:
|
||||||
- id: C.1.1
|
- textAppend:
|
||||||
changes:
|
text: "third"
|
||||||
- blockAdd:
|
readKey: key.Read.1
|
||||||
id: third
|
|
||||||
targetId: root
|
|
||||||
readKey: key.Read.1
|
|
||||||
keys:
|
keys:
|
||||||
Enc:
|
Enc:
|
||||||
- A
|
- A
|
||||||
@ -106,4 +99,5 @@ graph:
|
|||||||
baseSnapshot: A.1.1
|
baseSnapshot: A.1.1
|
||||||
aclHeads: [B.1.1]
|
aclHeads: [B.1.1]
|
||||||
treeHeads: [B.1.1]
|
treeHeads: [B.1.1]
|
||||||
|
heads:
|
||||||
|
- "A.1.3"
|
||||||
|
|||||||
@ -1,72 +1,70 @@
|
|||||||
thread:
|
thread:
|
||||||
author: A
|
author: A
|
||||||
logs:
|
changes:
|
||||||
- id: A.1
|
- id: A.1.1
|
||||||
identity: A
|
identity: A
|
||||||
records:
|
aclSnapshot:
|
||||||
- id: A.1.1
|
userStates:
|
||||||
aclSnapshot:
|
- identity: A
|
||||||
userStates:
|
encryptionKey: key.Enc.A
|
||||||
- identity: A
|
encryptedReadKeys: [key.Read.1]
|
||||||
encryptionKey: key.Enc.A
|
permission: admin
|
||||||
encryptedReadKeys: [key.Read.1]
|
- identity: B
|
||||||
permission: admin
|
encryptionKey: key.Enc.B
|
||||||
- identity: B
|
encryptedReadKeys: [key.Read.1]
|
||||||
encryptionKey: key.Enc.B
|
permission: admin
|
||||||
encryptedReadKeys: [key.Read.1]
|
snapshot:
|
||||||
permission: admin
|
text: "some text"
|
||||||
snapshot:
|
aclChanges:
|
||||||
blocks:
|
- userAdd:
|
||||||
- id: root
|
identity: A
|
||||||
aclChanges:
|
permission: admin
|
||||||
- userAdd:
|
encryptionKey: key.Enc.A
|
||||||
identity: A
|
encryptedReadKeys: [key.Read.1]
|
||||||
permission: admin
|
- userAdd:
|
||||||
encryptionKey: key.Enc.A
|
identity: B
|
||||||
encryptedReadKeys: [key.Read.1]
|
permission: admin
|
||||||
- userAdd:
|
encryptionKey: key.Enc.B
|
||||||
identity: B
|
encryptedReadKeys: [key.Read.1]
|
||||||
permission: admin
|
changes:
|
||||||
encryptionKey: key.Enc.B
|
- textAppend:
|
||||||
encryptedReadKeys: [key.Read.1]
|
text: "some text"
|
||||||
changes:
|
readKey: key.Read.1
|
||||||
- blockAdd:
|
- id: A.1.2
|
||||||
id: root
|
identity: A
|
||||||
readKey: key.Read.1
|
aclChanges:
|
||||||
- id: A.1.2
|
- userRemove:
|
||||||
aclChanges:
|
removedIdentity: B
|
||||||
- userRemove:
|
newReadKey: key.Read.2
|
||||||
removedIdentity: B
|
identitiesLeft: [A, C]
|
||||||
newReadKey: key.Read.2
|
readKey: key.Read.2
|
||||||
identitiesLeft: [A, C]
|
- id: A.1.3
|
||||||
readKey: key.Read.2
|
identity: A
|
||||||
- id: A.1.3
|
aclChanges:
|
||||||
aclChanges:
|
- userAdd:
|
||||||
- userAdd:
|
identity: E
|
||||||
identity: E
|
permission: admin
|
||||||
permission: admin
|
encryptionKey: key.Enc.E
|
||||||
encryptionKey: key.Enc.E
|
encryptedReadKeys: [key.Read.1, key.Read.2]
|
||||||
encryptedReadKeys: [key.Read.1, key.Read.2]
|
readKey: key.Read.2
|
||||||
readKey: key.Read.2
|
- id: B.1.1
|
||||||
- id: B.1
|
|
||||||
identity: B
|
identity: B
|
||||||
records:
|
aclChanges:
|
||||||
- id: B.1.1
|
- userAdd:
|
||||||
aclChanges:
|
identity: C
|
||||||
- userAdd:
|
permission: admin
|
||||||
identity: C
|
encryptionKey: key.Enc.C
|
||||||
permission: admin
|
encryptedReadKeys: [ key.Read.1 ]
|
||||||
encryptionKey: key.Enc.C
|
readKey: key.Read.1
|
||||||
encryptedReadKeys: [ key.Read.1 ]
|
- id: B.1.2
|
||||||
readKey: key.Read.1
|
identity: B
|
||||||
- id: B.1.2
|
aclChanges:
|
||||||
aclChanges:
|
- userAdd:
|
||||||
- userAdd:
|
identity: D
|
||||||
identity: D
|
permission: admin
|
||||||
permission: admin
|
encryptionKey: key.Enc.D
|
||||||
encryptionKey: key.Enc.D
|
encryptedReadKeys: [ key.Read.1 ]
|
||||||
encryptedReadKeys: [ key.Read.1 ]
|
readKey: key.Read.1
|
||||||
readKey: key.Read.1
|
|
||||||
keys:
|
keys:
|
||||||
Enc:
|
Enc:
|
||||||
- A
|
- A
|
||||||
@ -103,3 +101,6 @@ graph:
|
|||||||
baseSnapshot: A.1.1
|
baseSnapshot: A.1.1
|
||||||
aclHeads: [A.1.2]
|
aclHeads: [A.1.2]
|
||||||
treeHeads: [A.1.2]
|
treeHeads: [A.1.2]
|
||||||
|
heads:
|
||||||
|
- "A.1.3"
|
||||||
|
- "B.1.2"
|
||||||
|
|||||||
@ -1,68 +1,65 @@
|
|||||||
thread:
|
thread:
|
||||||
author: A
|
author: A
|
||||||
logs:
|
changes:
|
||||||
- id: A.1
|
- id: A.1.1
|
||||||
identity: A
|
identity: A
|
||||||
records:
|
aclSnapshot:
|
||||||
- id: A.1.1
|
userStates:
|
||||||
aclSnapshot:
|
- identity: A
|
||||||
userStates:
|
encryptionKey: key.Enc.A
|
||||||
- identity: A
|
encryptedReadKeys: [key.Read.1]
|
||||||
encryptionKey: key.Enc.A
|
permission: admin
|
||||||
encryptedReadKeys: [key.Read.1]
|
snapshot:
|
||||||
permission: admin
|
text: "some text"
|
||||||
snapshot:
|
aclChanges:
|
||||||
blocks:
|
- userAdd:
|
||||||
- id: root
|
identity: A
|
||||||
aclChanges:
|
permission: admin
|
||||||
- userAdd:
|
encryptionKey: key.Enc.A
|
||||||
identity: A
|
encryptedReadKeys: [key.Read.1]
|
||||||
permission: admin
|
changes:
|
||||||
encryptionKey: key.Enc.A
|
- textAppend:
|
||||||
encryptedReadKeys: [key.Read.1]
|
text: "some text"
|
||||||
changes:
|
readKey: key.Read.1
|
||||||
- blockAdd:
|
- id: A.1.2
|
||||||
id: root
|
identity: A
|
||||||
readKey: key.Read.1
|
aclChanges:
|
||||||
- id: A.1.2
|
- userInvite:
|
||||||
aclChanges:
|
acceptKey: key.Sign.Onetime1
|
||||||
- userInvite:
|
encryptionKey: key.Enc.Onetime1
|
||||||
acceptKey: key.Sign.Onetime1
|
encryptedReadKeys: [key.Read.1]
|
||||||
encryptionKey: key.Enc.Onetime1
|
permissions: writer
|
||||||
encryptedReadKeys: [key.Read.1]
|
readKey: key.Read.1
|
||||||
permissions: writer
|
- id: A.1.3
|
||||||
readKey: key.Read.1
|
identity: A
|
||||||
- id: A.1.3
|
aclChanges:
|
||||||
aclChanges:
|
- userRemove:
|
||||||
- userRemove:
|
removedIdentity: B
|
||||||
removedIdentity: B
|
newReadKey: key.Read.2
|
||||||
newReadKey: key.Read.2
|
identitiesLeft: [A]
|
||||||
identitiesLeft: [A]
|
readKey: key.Read.2
|
||||||
readKey: key.Read.2
|
- id: A.1.4
|
||||||
- id: A.1.4
|
identity: A
|
||||||
changes:
|
changes:
|
||||||
- blockAdd:
|
- textAppend:
|
||||||
id: second
|
text: "first"
|
||||||
targetId: root
|
readKey: key.Read.2
|
||||||
readKey: key.Read.2
|
- id: B.1.1
|
||||||
- id: B.1
|
|
||||||
identity: B
|
identity: B
|
||||||
records:
|
aclChanges:
|
||||||
- id: B.1.1
|
- userJoin:
|
||||||
aclChanges:
|
identity: B
|
||||||
- userJoin:
|
encryptionKey: key.Enc.B
|
||||||
identity: B
|
acceptSignature: key.Sign.Onetime1
|
||||||
encryptionKey: key.Enc.B
|
inviteId: A.1.2
|
||||||
acceptSignature: key.Sign.Onetime1
|
encryptedReadKeys: [key.Read.1]
|
||||||
inviteId: A.1.2
|
readKey: key.Read.1
|
||||||
encryptedReadKeys: [key.Read.1]
|
- id: B.1.2
|
||||||
readKey: key.Read.1
|
identity: B
|
||||||
- id: B.1.2
|
changes:
|
||||||
changes:
|
- textAppend:
|
||||||
- blockAdd:
|
text: "second"
|
||||||
id: first
|
readKey: key.Read.1
|
||||||
targetId: root
|
|
||||||
readKey: key.Read.1
|
|
||||||
keys:
|
keys:
|
||||||
Enc:
|
Enc:
|
||||||
- A
|
- A
|
||||||
@ -104,3 +101,6 @@ graph:
|
|||||||
aclSnapshot: A.1.1
|
aclSnapshot: A.1.1
|
||||||
aclHeads: [A.1.3]
|
aclHeads: [A.1.3]
|
||||||
treeHeads: [A.1.3]
|
treeHeads: [A.1.3]
|
||||||
|
heads:
|
||||||
|
- "A.1.4"
|
||||||
|
- "B.1.2"
|
||||||
|
|||||||
@ -1,91 +1,91 @@
|
|||||||
thread:
|
thread:
|
||||||
author: A
|
author: A
|
||||||
logs:
|
changes:
|
||||||
- id: A.1
|
- id: A.1.1
|
||||||
identity: A
|
identity: A
|
||||||
records:
|
aclSnapshot:
|
||||||
- id: A.1.1
|
userStates:
|
||||||
aclSnapshot:
|
- identity: A
|
||||||
userStates:
|
encryptionKey: key.Enc.A
|
||||||
- identity: A
|
encryptedReadKeys: [key.Read.1]
|
||||||
encryptionKey: key.Enc.A
|
permission: admin
|
||||||
encryptedReadKeys: [key.Read.1]
|
- identity: B
|
||||||
permission: admin
|
encryptionKey: key.Enc.B
|
||||||
- identity: B
|
encryptedReadKeys: [key.Read.1]
|
||||||
encryptionKey: key.Enc.B
|
permission: admin
|
||||||
encryptedReadKeys: [key.Read.1]
|
snapshot:
|
||||||
permission: admin
|
text: "some text"
|
||||||
snapshot:
|
aclChanges:
|
||||||
blocks:
|
- userAdd:
|
||||||
- id: root
|
identity: A
|
||||||
aclChanges:
|
permission: admin
|
||||||
- userAdd:
|
encryptionKey: key.Enc.A
|
||||||
identity: A
|
encryptedReadKeys: [key.Read.1]
|
||||||
permission: admin
|
- userAdd:
|
||||||
encryptionKey: key.Enc.A
|
identity: B
|
||||||
encryptedReadKeys: [key.Read.1]
|
permission: admin
|
||||||
- userAdd:
|
encryptionKey: key.Enc.B
|
||||||
identity: B
|
encryptedReadKeys: [key.Read.1]
|
||||||
permission: admin
|
readKey: key.Read.1
|
||||||
encryptionKey: key.Enc.B
|
changes:
|
||||||
encryptedReadKeys: [key.Read.1]
|
- textAppend:
|
||||||
readKey: key.Read.1
|
text: "some text"
|
||||||
- id: A.1.2
|
- id: A.1.2
|
||||||
aclSnapshot:
|
identity: A
|
||||||
userStates:
|
aclSnapshot:
|
||||||
- identity: A
|
userStates:
|
||||||
encryptionKey: key.Enc.A
|
- identity: A
|
||||||
encryptedReadKeys: [key.Read.1]
|
encryptionKey: key.Enc.A
|
||||||
permission: admin
|
encryptedReadKeys: [key.Read.1]
|
||||||
- identity: B
|
permission: admin
|
||||||
encryptionKey: key.Enc.B
|
- identity: B
|
||||||
encryptedReadKeys: [key.Read.1]
|
encryptionKey: key.Enc.B
|
||||||
permission: admin
|
encryptedReadKeys: [key.Read.1]
|
||||||
- identity: C
|
permission: admin
|
||||||
encryptionKey: key.Enc.C
|
- identity: C
|
||||||
encryptedReadKeys: [ key.Read.1 ]
|
encryptionKey: key.Enc.C
|
||||||
permission: admin
|
encryptedReadKeys: [ key.Read.1 ]
|
||||||
- identity: D
|
permission: admin
|
||||||
encryptionKey: key.Enc.D
|
- identity: D
|
||||||
encryptedReadKeys: [ key.Read.1 ]
|
encryptionKey: key.Enc.D
|
||||||
permission: admin
|
encryptedReadKeys: [ key.Read.1 ]
|
||||||
snapshot:
|
permission: admin
|
||||||
blocks:
|
snapshot:
|
||||||
- id: root
|
text: "some text"
|
||||||
aclChanges:
|
aclChanges:
|
||||||
- userAdd:
|
- userAdd:
|
||||||
identity: D
|
identity: D
|
||||||
permission: admin
|
permission: admin
|
||||||
encryptionKey: key.Enc.D
|
encryptionKey: key.Enc.D
|
||||||
encryptedReadKeys: [key.Read.1]
|
encryptedReadKeys: [key.Read.1]
|
||||||
readKey: key.Read.1
|
readKey: key.Read.1
|
||||||
- id: A.1.3
|
- id: A.1.3
|
||||||
aclChanges:
|
identity: A
|
||||||
- userAdd:
|
aclChanges:
|
||||||
identity: E
|
- userAdd:
|
||||||
permission: admin
|
identity: E
|
||||||
encryptionKey: key.Enc.E
|
permission: admin
|
||||||
encryptedReadKeys: [key.Read.1]
|
encryptionKey: key.Enc.E
|
||||||
readKey: key.Read.1
|
encryptedReadKeys: [key.Read.1]
|
||||||
- id: B.1
|
readKey: key.Read.1
|
||||||
|
- id: B.1.1
|
||||||
identity: B
|
identity: B
|
||||||
records:
|
aclChanges:
|
||||||
- id: B.1.1
|
- userAdd:
|
||||||
aclChanges:
|
identity: C
|
||||||
- userAdd:
|
permission: admin
|
||||||
identity: C
|
encryptionKey: key.Enc.C
|
||||||
permission: admin
|
encryptedReadKeys: [ key.Read.1 ]
|
||||||
encryptionKey: key.Enc.C
|
readKey: key.Read.1
|
||||||
encryptedReadKeys: [ key.Read.1 ]
|
- id: B.1.2
|
||||||
readKey: key.Read.1
|
identity: B
|
||||||
- id: B.1.2
|
aclChanges:
|
||||||
aclChanges:
|
- userAdd:
|
||||||
- userAdd:
|
identity: F
|
||||||
identity: F
|
permission: admin
|
||||||
permission: admin
|
encryptionKey: key.Enc.F
|
||||||
encryptionKey: key.Enc.F
|
encryptedReadKeys: [ key.Read.1 ]
|
||||||
encryptedReadKeys: [ key.Read.1 ]
|
readKey: key.Read.1
|
||||||
readKey: key.Read.1
|
|
||||||
keys:
|
keys:
|
||||||
Enc:
|
Enc:
|
||||||
- A
|
- A
|
||||||
@ -124,3 +124,7 @@ graph:
|
|||||||
baseSnapshot: A.1.2
|
baseSnapshot: A.1.2
|
||||||
aclHeads: [A.1.2]
|
aclHeads: [A.1.2]
|
||||||
treeHeads: [A.1.2]
|
treeHeads: [A.1.2]
|
||||||
|
heads:
|
||||||
|
- "A.1.3"
|
||||||
|
- "B.1.2"
|
||||||
|
|
||||||
|
|||||||
@ -67,7 +67,7 @@ type ACLChange struct {
|
|||||||
type PlainTextChange struct {
|
type PlainTextChange struct {
|
||||||
TextAppend *struct {
|
TextAppend *struct {
|
||||||
Text string `yaml:"text"`
|
Text string `yaml:"text"`
|
||||||
} `yaml:"blockAdd"`
|
} `yaml:"textAppend"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type YMLThread struct {
|
type YMLThread struct {
|
||||||
|
|||||||
@ -6,7 +6,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func Test_YamlParse(t *testing.T) {
|
func Test_YamlParse(t *testing.T) {
|
||||||
tb, _ := NewThreadBuilderFromFile("userjoinexample.yml")
|
tb, _ := NewThreadBuilderFromFile("validsnapshotexample.yml")
|
||||||
gr, _ := tb.Graph()
|
gr, _ := tb.Graph()
|
||||||
fmt.Println(gr)
|
fmt.Println(gr)
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user