/* Copyright © 2025 filifa This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ package dot import ( "math" igraph "scm.dairydemon.net/filifa/gv2adj/cmd/internal/graph" "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/multi" ) // DOTDirectedGraph is a graph to unmarshal DOT graphs. type DOTDirectedGraph struct { *igraph.DirectedGraph WeightAttribute string } // NewDOTDirectedGraph returns a graph with no nodes or edges. func NewDOTDirectedGraph(weightAttr string) *DOTDirectedGraph { return &DOTDirectedGraph{DirectedGraph: igraph.NewDirectedGraph(), WeightAttribute: weightAttr} } // NewLine returns a DOT-aware weighted line. func (g *DOTDirectedGraph) NewLine(from, to graph.Node) graph.Line { var defaultWeight float64 if g.WeightAttribute == "" { defaultWeight = 1 } else { defaultWeight = math.NaN() } e := g.DirectedGraph.NewWeightedLine(from, to, defaultWeight).(multi.WeightedLine) return &weightedLine{WeightedLine: e, weightAttribute: g.WeightAttribute} } // NewNode returns a DOT-aware Node. func (g *DOTDirectedGraph) NewNode() graph.Node { return &Node{Node: g.DirectedGraph.NewNode()} } // SetLine adds a DOT-aware weighted line to the graph. func (g *DOTDirectedGraph) SetLine(e graph.Line) { g.DirectedGraph.SetWeightedLine(e.(*weightedLine)) }