// Package gg implements ginger graph creation, traversal, and (de)serialization package gg import ( "fmt" "github.com/mediocregopher/ginger/graph" ) // ZeroValue is a Value with no fields set. var ZeroValue Value // Value represents a value being stored in a Graph. type Value struct { // Only one of these fields may be set Name *string Number *int64 Graph *graph.Graph[Value] // TODO coming soon! // String *string // Optional fields indicating the token which was used to construct this // Value, if any. LexerToken *LexerToken } // IsZero returns true if the Value is the zero value (none of the sub-value // fields are set). LexerToken is ignored for this check. func (v Value) IsZero() bool { return v.Equal(ZeroValue) } // Equal returns true if the passed in Value is equivalent, ignoring the // LexerToken on either Value. // // Will panic if the passed in v2 is not a Value from this package. func (v Value) Equal(v2g graph.Value) bool { v2 := v2g.(Value) v.LexerToken, v2.LexerToken = nil, nil switch { case v == ZeroValue && v2 == ZeroValue: return true case v.Name != nil && v2.Name != nil && *v.Name == *v2.Name: return true case v.Number != nil && v2.Number != nil && *v.Number == *v2.Number: return true case v.Graph != nil && v2.Graph != nil && v.Graph.Equal(v2.Graph): return true default: return false } } func (v Value) String() string { switch { case v.Name != nil: return *v.Name case v.Number != nil: return fmt.Sprint(*v.Number) case v.Graph != nil: return v.Graph.String() default: return "" } }