Adds 'hyperguild brain query <topic>' against the brain HTTP REST /query endpoint. Default human output prints path + score + title; --json passes through the response envelope. --limit overrides the default 5-result cap. runBrainWrite remains a stub for Task 5.
60 lines
1.6 KiB
Go
60 lines
1.6 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"errors"
|
|
"flag"
|
|
"fmt"
|
|
"io"
|
|
)
|
|
|
|
func runBrain(ctx context.Context, args []string, stdin io.Reader, stdout, stderr io.Writer) error {
|
|
if len(args) == 0 {
|
|
return errors.New("brain: subcommand required (query|write)")
|
|
}
|
|
switch args[0] {
|
|
case "query":
|
|
return runBrainQuery(ctx, args[1:], stdin, stdout, stderr)
|
|
case "write":
|
|
return runBrainWrite(ctx, args[1:], stdin, stdout, stderr)
|
|
default:
|
|
return fmt.Errorf("brain: unknown subcommand: %s (expected query|write)", args[0])
|
|
}
|
|
}
|
|
|
|
func runBrainQuery(ctx context.Context, args []string, _ io.Reader, stdout, stderr io.Writer) error {
|
|
fs := flag.NewFlagSet("brain query", flag.ContinueOnError)
|
|
fs.SetOutput(stderr)
|
|
asJSON := fs.Bool("json", false, "output JSON instead of human-readable")
|
|
limit := fs.Int("limit", 5, "maximum number of results")
|
|
if err := fs.Parse(args); err != nil {
|
|
return fmt.Errorf("parse flags: %w", err)
|
|
}
|
|
if fs.NArg() < 1 {
|
|
return errors.New("brain query: topic required")
|
|
}
|
|
topic := fs.Arg(0)
|
|
|
|
res, err := newBrainClient().Query(ctx, topic, *limit)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if *asJSON {
|
|
enc := json.NewEncoder(stdout)
|
|
enc.SetIndent("", " ")
|
|
return enc.Encode(res)
|
|
}
|
|
for _, hit := range res.Results {
|
|
fmt.Fprintf(stdout, "%s score=%d %s\n", hit.Path, hit.Score, hit.Title) //nolint:errcheck
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// runBrainWrite is implemented in Task 5; stub now returns an explicit error
|
|
// so the router compiles and tests for runBrainQuery can run.
|
|
func runBrainWrite(_ context.Context, _ []string, _ io.Reader, _, _ io.Writer) error {
|
|
return errors.New("brain write: not implemented (Task 5)")
|
|
}
|