package main import ( "context" "encoding/json" "flag" "fmt" "log/slog" "os" "os/signal" "path/filepath" "slices" "git.sunturtle.xyz/zephyr/horse/mdb" "git.sunturtle.xyz/zephyr/horse/umadump/ism" "golang.org/x/sync/errgroup" "zombiezen.com/go/sqlite" "zombiezen.com/go/sqlite/sqlitex" ) func main() { var ( mdbf string dirs []string files []string ) flag.StringVar(&mdbf, "-mdb", "", "`path` to master.mdb") flag.Func("d", "idle_single_mode `dir`ectory (may be specified multiple times)", func(s string) error { dirs = append(dirs, s) return nil }) flag.Parse() files = slices.Clone(flag.Args()) for _, dir := range dirs { ds, err := os.ReadDir(dir) if err != nil { slog.Error("getting files in directory", slog.String("dir", dir), slog.Any("err", err)) os.Exit(1) } for _, d := range ds { if d.IsDir() { continue } files = append(files, filepath.Join(dir, d.Name())) } } ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt) go func() { <-ctx.Done() stop() }() db, err := sqlitex.NewPool(mdbf, sqlitex.PoolOptions{Flags: sqlite.OpenReadOnly}) if err != nil { slog.Error("mdb", slog.Any("err", err)) os.Exit(1) } slog.Info("load skills") skills, err := mdb.Skills(ctx, db) if err != nil { slog.Error("skills", slog.Any("err", err)) os.Exit(1) } slog.Info("load sparks") sparks, err := mdb.Sparks(ctx, db) if err != nil { slog.Error("sparks", slog.Any("err", err)) os.Exit(1) } slog.Info("load umas") umas, err := mdb.Umas(ctx, db) if err != nil { slog.Error("umas", slog.Any("err", err)) os.Exit(1) } slog.Info("mdb", slog.Int("sparks", len(sparks)), slog.Int("skills", len(skills)), slog.Int("umas", len(umas)), ) tab := makeTables(skills, sparks, umas) g, ctx := errgroup.WithContext(ctx) g.SetLimit(64) for _, file := range files { g.Go(func() error { return dofile(ctx, file) }) } if err := g.Wait(); err != nil { slog.Error("process", slog.Any("err", err)) os.Exit(1) } } func dofile(ctx context.Context, file string) error { f, err := os.Open(file) if err != nil { return err } var career ism.WorkIdleSingleMode d := json.NewDecoder(f) d.DisallowUnknownFields() if err := d.Decode(&career); err != nil { return fmt.Errorf("%s: %w", file, err) } }