// Copyright ©2017 The Gonum Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package encoding import "gonum.org/v1/gonum/graph" // Builder is a graph that can have user-defined nodes and edges added. type Builder interface { graph.Graph graph.Builder } // MultiBuilder is a graph that can have user-defined nodes and edges added. type MultiBuilder interface { graph.Multigraph graph.MultigraphBuilder } // AttributeSetter is implemented by types that can set an encoded graph // attribute. type AttributeSetter interface { SetAttribute(Attribute) error } // Attributer defines graph.Node or graph.Edge values that can // specify graph attributes. type Attributer interface { Attributes() []Attribute } // Attribute is an encoded key value attribute pair use in graph encoding. type Attribute struct { Key, Value string } // Attributes is a helper type providing simple attribute handling. type Attributes []Attribute // Attributes returns all of the receiver's attributes. func (a *Attributes) Attributes() []Attribute { return *a } // SetAttribute sets attr in the receiver. Calling SetAttribute with an // Attribute with a Key that is in the collection replaces the existing // value and calling with an empty Value removes the attribute from the // collection if it exists. SetAttribute always returns nil. func (a *Attributes) SetAttribute(attr Attribute) error { if attr.Key == "" { return nil } for i, v := range *a { if v.Key == attr.Key { if attr.Value == "" { (*a)[i] = (*a)[len(*a)-1] *a = (*a)[:len(*a)-1] return nil } (*a)[i].Value = attr.Value return nil } } if attr.Value != "" { *a = append(*a, attr) } return nil }