package cmd
import (
"context"
"flag"
"fmt"
"os"
"skraak/db"
"skraak/tools"
)
func RunDataset(args []string) {
if len(args) < 1 {
printDatasetUsage()
os.Exit(1)
}
switch args[0] {
case "create":
RunDatasetCreate(args[1:])
case "update":
RunDatasetUpdate(args[1:])
default:
fmt.Fprintf(os.Stderr, "Unknown dataset subcommand: %s\n\n", args[0])
printDatasetUsage()
os.Exit(1)
}
}
func printDatasetUsage() {
fmt.Fprintf(os.Stderr, "Usage: skraak dataset <subcommand> [options]\n\n")
fmt.Fprintf(os.Stderr, "Subcommands:\n")
fmt.Fprintf(os.Stderr, " create Create a new dataset (type defaults to 'structured')\n")
fmt.Fprintf(os.Stderr, " update Update an existing dataset\n")
fmt.Fprintf(os.Stderr, "\nExamples:\n")
fmt.Fprintf(os.Stderr, " skraak dataset create --db ./db/skraak.duckdb --name \"Test Dataset\"\n")
fmt.Fprintf(os.Stderr, " skraak dataset create --db ./db/skraak.duckdb --name \"Training Data\" --type train\n")
fmt.Fprintf(os.Stderr, " skraak dataset update --db ./db/skraak.duckdb --id abc123 --name \"Updated Name\"\n")
}
func RunDatasetCreate(args []string) {
fs := flag.NewFlagSet("create dataset", flag.ExitOnError)
dbPath := fs.String("db", "", "Path to DuckDB database (required)")
name := fs.String("name", "", "Dataset name (required)")
dsType := fs.String("type", "structured", "Dataset type: structured (default), unstructured, test, train")
description := fs.String("description", "", "Dataset description (optional)")
fs.Usage = func() {
fmt.Fprintf(os.Stderr, "Usage: skraak create dataset [options]\n\n")
fmt.Fprintf(os.Stderr, "Create a new dataset.\n\n")
fmt.Fprintf(os.Stderr, "Options:\n")
fs.PrintDefaults()
fmt.Fprintf(os.Stderr, "\nExamples:\n")
fmt.Fprintf(os.Stderr, " skraak create dataset --db ./db/skraak.duckdb --name \"My Dataset\"\n")
fmt.Fprintf(os.Stderr, " skraak create dataset --db ./db/skraak.duckdb --name \"Training Data\" --type train --description \"For ML training\"\n")
}
if err := fs.Parse(args); err != nil {
os.Exit(1)
}
missing := []string{}
if *dbPath == "" {
missing = append(missing, "--db")
}
if *name == "" {
missing = append(missing, "--name")
}
if len(missing) > 0 {
fmt.Fprintf(os.Stderr, "Error: missing required flags: %v\n\n", missing)
fs.Usage()
os.Exit(1)
}
tools.SetDBPath(*dbPath)
eventLogPath := *dbPath + ".events.jsonl"
db.SetEventLogConfig(db.EventLogConfig{
Enabled: true,
Path: eventLogPath,
})
defer db.CloseEventLog()
input := tools.DatasetInput{
Name: name,
Type: dsType,
Description: description,
}
output, err := tools.CreateOrUpdateDataset(context.Background(), input)
if err != nil {
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
os.Exit(1)
}
printJSON(output)
}
func RunDatasetUpdate(args []string) {
fs := flag.NewFlagSet("update dataset", flag.ExitOnError)
dbPath := fs.String("db", "", "Path to DuckDB database (required)")
id := fs.String("id", "", "Dataset ID (required)")
name := fs.String("name", "", "New dataset name")
dsType := fs.String("type", "", "New dataset type: structured, unstructured, test, train")
description := fs.String("description", "", "New dataset description")
fs.Usage = func() {
fmt.Fprintf(os.Stderr, "Usage: skraak update dataset [options]\n\n")
fmt.Fprintf(os.Stderr, "Update an existing dataset. Only provided fields are updated.\n\n")
fmt.Fprintf(os.Stderr, "Options:\n")
fs.PrintDefaults()
fmt.Fprintf(os.Stderr, "\nExamples:\n")
fmt.Fprintf(os.Stderr, " skraak update dataset --db ./db/skraak.duckdb --id abc123 --name \"Updated Name\"\n")
fmt.Fprintf(os.Stderr, " skraak update dataset --db ./db/skraak.duckdb --id abc123 --type train\n")
}
if err := fs.Parse(args); err != nil {
os.Exit(1)
}
missing := []string{}
if *dbPath == "" {
missing = append(missing, "--db")
}
if *id == "" {
missing = append(missing, "--id")
}
if len(missing) > 0 {
fmt.Fprintf(os.Stderr, "Error: missing required flags: %v\n\n", missing)
fs.Usage()
os.Exit(1)
}
tools.SetDBPath(*dbPath)
eventLogPath := *dbPath + ".events.jsonl"
db.SetEventLogConfig(db.EventLogConfig{
Enabled: true,
Path: eventLogPath,
})
defer db.CloseEventLog()
input := tools.DatasetInput{
ID: id,
}
if *name != "" {
input.Name = name
}
if *dsType != "" {
input.Type = dsType
}
if *description != "" {
input.Description = description
}
output, err := tools.CreateOrUpdateDataset(context.Background(), input)
if err != nil {
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
os.Exit(1)
}
printJSON(output)
}