horsegen: load and generate in parallel
This commit is contained in:
5
go.mod
5
go.mod
@@ -2,7 +2,10 @@ module git.sunturtle.xyz/zephyr/horse
|
||||
|
||||
go 1.24.1
|
||||
|
||||
require zombiezen.com/go/sqlite v1.4.2
|
||||
require (
|
||||
golang.org/x/sync v0.14.0
|
||||
zombiezen.com/go/sqlite v1.4.2
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/dustin/go-humanize v1.0.1 // indirect
|
||||
|
||||
100
horsegen/main.go
100
horsegen/main.go
@@ -8,6 +8,7 @@ import (
|
||||
"os/signal"
|
||||
"path/filepath"
|
||||
|
||||
"golang.org/x/sync/errgroup"
|
||||
"zombiezen.com/go/sqlite"
|
||||
"zombiezen.com/go/sqlite/sqlitex"
|
||||
)
|
||||
@@ -21,9 +22,9 @@ func main() {
|
||||
flag.StringVar(&out, "kk", `.\horse`, "existing `dir`ectory for output Koka files")
|
||||
flag.Parse()
|
||||
|
||||
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
|
||||
pctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
|
||||
go func() {
|
||||
<-ctx.Done()
|
||||
<-pctx.Done()
|
||||
stop()
|
||||
}()
|
||||
|
||||
@@ -40,49 +41,62 @@ func main() {
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
slog.Info("get characters")
|
||||
charas, err := Characters(ctx, db)
|
||||
if err != nil {
|
||||
slog.Error("getting characters", slog.Any("err", err))
|
||||
os.Exit(1)
|
||||
}
|
||||
slog.Info("get pairs")
|
||||
pairs, err := CharacterPairs(ctx, db)
|
||||
if err != nil {
|
||||
slog.Error("getting pairs", slog.Any("err", err))
|
||||
os.Exit(1)
|
||||
}
|
||||
slog.Info("get trios")
|
||||
trios, err := CharacterTrios(ctx, db)
|
||||
if err != nil {
|
||||
slog.Error("getting trios", slog.Any("err", err))
|
||||
os.Exit(1)
|
||||
}
|
||||
slog.Info("get skill groups")
|
||||
sg, err := SkillGroups(ctx, db)
|
||||
if err != nil {
|
||||
slog.Error("getting skill groups", slog.Any("err", err))
|
||||
eg, ctx := errgroup.WithContext(pctx)
|
||||
var (
|
||||
charas []NamedID[Character]
|
||||
pairs []AffinityRelation
|
||||
trios []AffinityRelation
|
||||
sg []NamedID[SkillGroup]
|
||||
)
|
||||
eg.Go(func() error {
|
||||
slog.Info("get characters")
|
||||
r, err := Characters(ctx, db)
|
||||
charas = r
|
||||
return err
|
||||
})
|
||||
eg.Go(func() error {
|
||||
slog.Info("get pairs")
|
||||
r, err := CharacterPairs(ctx, db)
|
||||
pairs = r
|
||||
return err
|
||||
})
|
||||
eg.Go(func() error {
|
||||
slog.Info("get trios")
|
||||
r, err := CharacterTrios(ctx, db)
|
||||
trios = r
|
||||
return err
|
||||
})
|
||||
eg.Go(func() error {
|
||||
slog.Info("get skill groups")
|
||||
r, err := SkillGroups(ctx, db)
|
||||
sg = r
|
||||
return err
|
||||
})
|
||||
if err := eg.Wait(); err != nil {
|
||||
slog.Error("load", slog.Any("err", err))
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
cf, err := os.Create(filepath.Join(out, "character.kk"))
|
||||
if err != nil {
|
||||
slog.Error("creating character.kk", slog.Any("err", err))
|
||||
os.Exit(1)
|
||||
}
|
||||
slog.Info("write characters")
|
||||
if err := ExecCharacterKK(t, cf, charas, pairs, trios); err != nil {
|
||||
slog.Error("writing character.kk", slog.Any("err", err))
|
||||
// continue on
|
||||
}
|
||||
sf, err := os.Create(filepath.Join(out, "skill.kk"))
|
||||
if err != nil {
|
||||
slog.Error("creating skill.kk", slog.Any("err", err))
|
||||
os.Exit(1)
|
||||
}
|
||||
slog.Info("write skills")
|
||||
if err := ExecSkillKK(t, sf, sg); err != nil {
|
||||
slog.Error("writing skill.kk", slog.Any("err", err))
|
||||
// continue on
|
||||
eg, ctx = errgroup.WithContext(pctx)
|
||||
eg.Go(func() error {
|
||||
cf, err := os.Create(filepath.Join(out, "character.kk"))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
slog.Info("write characters")
|
||||
return ExecCharacterKK(t, cf, charas, pairs, trios)
|
||||
})
|
||||
eg.Go(func() error {
|
||||
sf, err := os.Create(filepath.Join(out, "skill.kk"))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
slog.Info("write skills")
|
||||
return ExecSkillKK(t, sf, sg)
|
||||
})
|
||||
if err := eg.Wait(); err != nil {
|
||||
slog.Error("generate", slog.Any("err", err))
|
||||
} else {
|
||||
slog.Info("done")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user