mirror of
https://github.com/aptly-dev/aptly.git
synced 2026-05-07 22:20:24 +00:00
114 lines
3.4 KiB
Go
114 lines
3.4 KiB
Go
//Copyright 2013 GoGraphviz Authors
|
|
//
|
|
//Licensed under the Apache License, Version 2.0 (the "License");
|
|
//you may not use this file except in compliance with the License.
|
|
//You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
//Unless required by applicable law or agreed to in writing, software
|
|
//distributed under the License is distributed on an "AS IS" BASIS,
|
|
//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
//See the License for the specific language governing permissions and
|
|
//limitations under the License.
|
|
|
|
package gographviz
|
|
|
|
//The analysed representation of the Graph parsed from the DOT format.
|
|
type Graph struct {
|
|
Attrs Attrs
|
|
Name string
|
|
Directed bool
|
|
Strict bool
|
|
Nodes *Nodes
|
|
Edges *Edges
|
|
SubGraphs *SubGraphs
|
|
Relations *Relations
|
|
}
|
|
|
|
//Creates a new empty graph, ready to be populated.
|
|
func NewGraph() *Graph {
|
|
return &Graph{
|
|
Attrs: make(Attrs),
|
|
Name: "",
|
|
Directed: false,
|
|
Strict: false,
|
|
Nodes: NewNodes(),
|
|
Edges: NewEdges(),
|
|
SubGraphs: NewSubGraphs(),
|
|
Relations: NewRelations(),
|
|
}
|
|
}
|
|
|
|
//If the graph is strict then multiple edges are not allowed between the same pairs of nodes,
|
|
//see dot man page.
|
|
func (this *Graph) SetStrict(strict bool) {
|
|
this.Strict = strict
|
|
}
|
|
|
|
//Sets whether the graph is directed (true) or undirected (false).
|
|
func (this *Graph) SetDir(dir bool) {
|
|
this.Directed = dir
|
|
}
|
|
|
|
//Sets the graph name.
|
|
func (this *Graph) SetName(name string) {
|
|
this.Name = name
|
|
}
|
|
|
|
//Adds an edge to the graph from node src to node dst.
|
|
//srcPort and dstPort are the port the node ports, leave as empty strings if it is not required.
|
|
//This does not imply the adding of missing nodes.
|
|
func (this *Graph) AddPortEdge(src, srcPort, dst, dstPort string, directed bool, attrs map[string]string) {
|
|
this.Edges.Add(&Edge{src, srcPort, dst, dstPort, directed, attrs})
|
|
}
|
|
|
|
//Adds an edge to the graph from node src to node dst.
|
|
//This does not imply the adding of missing nodes.
|
|
//If directed is set to true then SetDir(true) must also be called or there will be a syntax error in the output.
|
|
func (this *Graph) AddEdge(src, dst string, directed bool, attrs map[string]string) {
|
|
this.AddPortEdge(src, "", dst, "", directed, attrs)
|
|
}
|
|
|
|
//Adds a node to a graph/subgraph.
|
|
//If not subgraph exists use the name of the main graph.
|
|
//This does not imply the adding of a missing subgraph.
|
|
func (this *Graph) AddNode(parentGraph string, name string, attrs map[string]string) {
|
|
this.Nodes.Add(&Node{name, attrs})
|
|
this.Relations.Add(parentGraph, name)
|
|
}
|
|
|
|
func (this *Graph) getAttrs(graphName string) Attrs {
|
|
if this.Name == graphName {
|
|
return this.Attrs
|
|
}
|
|
g, ok := this.SubGraphs.SubGraphs[graphName]
|
|
if !ok {
|
|
panic("graph or subgraph " + graphName + " does not exist")
|
|
}
|
|
return g.Attrs
|
|
}
|
|
|
|
//Adds an attribute to a graph/subgraph.
|
|
func (this *Graph) AddAttr(parentGraph string, field string, value string) {
|
|
this.getAttrs(parentGraph).Add(field, value)
|
|
}
|
|
|
|
//Adds a subgraph to a graph/subgraph.
|
|
func (this *Graph) AddSubGraph(parentGraph string, name string, attrs map[string]string) {
|
|
this.SubGraphs.Add(name)
|
|
for key, value := range attrs {
|
|
this.AddAttr(name, key, value)
|
|
}
|
|
}
|
|
|
|
func (this *Graph) IsNode(name string) bool {
|
|
_, ok := this.Nodes.Lookup[name]
|
|
return ok
|
|
}
|
|
|
|
func (this *Graph) IsSubGraph(name string) bool {
|
|
_, ok := this.SubGraphs.SubGraphs[name]
|
|
return ok
|
|
}
|