Add graph representation and reading
This commit is contained in:
parent
7a38370adb
commit
66d98098c5
1
.gitignore
vendored
1
.gitignore
vendored
@ -21,3 +21,4 @@
|
||||
# Go workspace file
|
||||
go.work
|
||||
|
||||
GraphSplit
|
||||
|
4
graph.txt
Normal file
4
graph.txt
Normal file
@ -0,0 +1,4 @@
|
||||
Split4,icon4,
|
||||
Split3,icon3,Split4
|
||||
Split2,icon2,Split4
|
||||
Start,icon1,Split2|Split3
|
136
main.go
Normal file
136
main.go
Normal file
@ -0,0 +1,136 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"errors"
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"os"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
// SplitState represents the state of a split
|
||||
type SplitState string
|
||||
|
||||
const (
|
||||
Locked SplitState = "locked"
|
||||
Unlocked SplitState = "unlocked"
|
||||
Started SplitState = "started"
|
||||
Finished SplitState = "finished"
|
||||
)
|
||||
|
||||
// Split represents a split in the speedrun graph
|
||||
type Split struct {
|
||||
ID int
|
||||
Name string
|
||||
Icon string
|
||||
Dependencies []*Split
|
||||
Timestamp time.Time
|
||||
State SplitState
|
||||
}
|
||||
|
||||
// Graph represents the speedrun graph
|
||||
type Graph struct {
|
||||
Splits []*Split
|
||||
Start *Split
|
||||
Final *Split
|
||||
}
|
||||
|
||||
// NewSplit creates a new split
|
||||
func NewSplit(name, icon string) *Split {
|
||||
return &Split{
|
||||
ID: rand.Intn(1000), // Randomly generating ID
|
||||
Name: name,
|
||||
Icon: icon,
|
||||
Timestamp: time.Time{},
|
||||
State: Locked,
|
||||
}
|
||||
}
|
||||
|
||||
// AddDependency adds a dependency to a split
|
||||
func (s *Split) AddDependency(dep *Split) {
|
||||
s.Dependencies = append(s.Dependencies, dep)
|
||||
}
|
||||
|
||||
// ReadGraphFromFile reads graph from file representation
|
||||
func ReadGraphFromFile(filename string) (*Graph, error) {
|
||||
file, err := os.Open(filename)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
scanner := bufio.NewScanner(file)
|
||||
splits := make(map[string]*Split)
|
||||
|
||||
// Read lines from file
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
parts := strings.Split(line, ",")
|
||||
name := parts[0]
|
||||
icon := parts[1]
|
||||
dependencies := strings.Split(parts[2], "|")
|
||||
|
||||
// Create split
|
||||
split := NewSplit(name, icon)
|
||||
splits[name] = split
|
||||
|
||||
// Create dependencies
|
||||
for _, depName := range dependencies {
|
||||
dep := splits[depName]
|
||||
if dep != nil {
|
||||
split.AddDependency(dep)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Set start and final splits
|
||||
var start, final *Split
|
||||
for _, split := range splits {
|
||||
if split.Name == "Start" {
|
||||
start = split
|
||||
} else if len(split.Dependencies) == 0 {
|
||||
if final != nil {
|
||||
fmt.Println(final.Name)
|
||||
return nil, errors.New("more than one final split found, only one split with no dependencies can exist")
|
||||
}
|
||||
final = split
|
||||
}
|
||||
}
|
||||
|
||||
if start == nil {
|
||||
return nil, errors.New("no start split found, there should be a split with name 'Start'")
|
||||
}
|
||||
if final == nil {
|
||||
return nil, errors.New("no final split found, there should be the only split with no dependencies")
|
||||
}
|
||||
|
||||
// Create graph
|
||||
graph := &Graph{
|
||||
Splits: make([]*Split, 0, len(splits)),
|
||||
Start: start,
|
||||
Final: final,
|
||||
}
|
||||
|
||||
// Append splits to graph
|
||||
for _, split := range splits {
|
||||
graph.Splits = append(graph.Splits, split)
|
||||
}
|
||||
|
||||
return graph, nil
|
||||
}
|
||||
|
||||
func main() {
|
||||
// Read graph from file
|
||||
graph, err := ReadGraphFromFile("graph.txt")
|
||||
if err != nil {
|
||||
fmt.Println("Error reading graph:", err)
|
||||
return
|
||||
}
|
||||
|
||||
// Example usage
|
||||
fmt.Println("Graph:")
|
||||
fmt.Println("Start:", graph.Start.Name)
|
||||
fmt.Println("Final:", graph.Final.Name)
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user