package cmd
import (
"context"
"flag"
"fmt"
"os"
"strconv"
"skraak/tools"
)
func RunClusterCreate(args []string) error {
fs := flag.NewFlagSet("cluster create", flag.ExitOnError)
dbPath := fs.String("db", "", "Path to DuckDB database (required)")
datasetID := fs.String("dataset", "", "Dataset ID (required)")
locationID := fs.String("location", "", "Location ID (required)")
name := fs.String("name", "", "Cluster name (required)")
sampleRate := fs.String("sample-rate", "", "Sample rate in Hz (required)")
description := fs.String("description", "", "Cluster description (optional)")
fs.Usage = func() {
fmt.Fprintf(os.Stderr, "Usage: skraak cluster create [options]\n\n")
fmt.Fprintf(os.Stderr, "Create a new cluster for grouping recordings.\n\n")
fmt.Fprintf(os.Stderr, "Options:\n")
fs.PrintDefaults()
fmt.Fprintf(os.Stderr, "\nExamples:\n")
fmt.Fprintf(os.Stderr, " skraak cluster create --db ./db/skraak.duckdb --dataset abc123 --location loc456 --name \"2024-01\" --sample-rate 250000\n")
}
if err := fs.Parse(args); err != nil {
return fmt.Errorf("parsing flags: %w", err)
}
if err := checkFlags(fs, "--db", *dbPath, "--dataset", *datasetID, "--location", *locationID, "--name", *name, "--sample-rate", *sampleRate); err != nil {
return err
}
sr, err := strconv.Atoi(*sampleRate)
if err != nil {
return fmt.Errorf("invalid sample rate: %w", err)
}
defer initEventLog(*dbPath)()
input := tools.ClusterInput{
DBPath: *dbPath,
DatasetID: datasetID,
LocationID: locationID,
Name: name,
SampleRate: &sr,
Description: description,
}
output, err := tools.CreateOrUpdateCluster(context.Background(), input)
if err != nil {
return fmt.Errorf("creating cluster: %w", err)
}
return printJSON(output)
}
func RunClusterUpdate(args []string) error {
fs := flag.NewFlagSet("cluster update", flag.ExitOnError)
dbPath := fs.String("db", "", "Path to DuckDB database (required)")
id := fs.String("id", "", "Cluster ID (required)")
name := fs.String("name", "", "New cluster name (optional)")
sampleRate := fs.String("sample-rate", "", "New sample rate in Hz (optional)")
description := fs.String("description", "", "New cluster description (optional)")
fs.Usage = func() {
fmt.Fprintf(os.Stderr, "Usage: skraak cluster update [options]\n\n")
fmt.Fprintf(os.Stderr, "Update an existing cluster. 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 cluster update --db ./db/skraak.duckdb --id clust123 --name \"New Name\"\n")
}
if err := fs.Parse(args); err != nil {
return fmt.Errorf("parsing flags: %w", err)
}
if err := checkFlags(fs, "--db", *dbPath, "--id", *id); err != nil {
return err
}
var sr *int
if *sampleRate != "" {
srVal, err := strconv.Atoi(*sampleRate)
if err != nil {
return fmt.Errorf("invalid sample rate: %w", err)
}
sr = &srVal
}
defer initEventLog(*dbPath)()
input := tools.ClusterInput{
DBPath: *dbPath,
ID: id,
}
if *name != "" {
input.Name = name
}
if sr != nil {
input.SampleRate = sr
}
if *description != "" {
input.Description = description
}
output, err := tools.CreateOrUpdateCluster(context.Background(), input)
if err != nil {
return fmt.Errorf("updating cluster: %w", err)
}
return printJSON(output)
}