From 234b057c41648d4980cf9c6260517bfee2a25ce0 Mon Sep 17 00:00:00 2001 From: "Claude (noether)" Date: Thu, 23 Jul 2026 11:23:53 +0200 Subject: [PATCH] =?UTF-8?q?sic=20v2=20client=20WP6:=20resolveVerbs=20?= =?UTF-8?q?=E2=80=94=20map=20hops=20to=20verbs=20by=20nest=20depth,=20fail?= =?UTF-8?q?-loud=20on=20overflow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/sic/addr.go | 18 ++++++++++++++++++ cmd/sic/resolveverbs_test.go | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 cmd/sic/resolveverbs_test.go diff --git a/cmd/sic/addr.go b/cmd/sic/addr.go index dd65d98..f4a48e2 100644 --- a/cmd/sic/addr.go +++ b/cmd/sic/addr.go @@ -43,3 +43,21 @@ func verbFor(runtime, name string) (string, error) { return "", fmt.Errorf("unknown runtime: %s", runtime) } } + +func resolveVerbs(hops []string, nest []string) ([]string, error) { + if len(hops) > len(nest) { + return nil, fmt.Errorf("too many hops for this host's nest depth") + } + if len(hops) == 0 { + return []string{}, nil + } + verbs := make([]string, len(hops)) + for i, hop := range hops { + verb, err := verbFor(nest[i], hop) + if err != nil { + return nil, err + } + verbs[i] = verb + } + return verbs, nil +} diff --git a/cmd/sic/resolveverbs_test.go b/cmd/sic/resolveverbs_test.go new file mode 100644 index 0000000..81f4d0a --- /dev/null +++ b/cmd/sic/resolveverbs_test.go @@ -0,0 +1,32 @@ +package main + +import ( + "reflect" + "testing" +) + +// WP6: resolveVerbs maps each hop to its verb via verbFor, keyed by DEPTH in the host's nest. +// Too many hops for the declared nest depth is a hard error (fail-loud); an unknown runtime +// propagates verbFor's error. Zero hops -> zero verbs (a bare host is a single v2 frame). +func TestResolveVerbs(t *testing.T) { + got, err := resolveVerbs([]string{"memory", "stash-stash-1"}, []string{"incus", "docker"}) + if err != nil { + t.Fatalf("unexpected err: %v", err) + } + want := []string{"incus exec memory --", "docker exec stash-stash-1"} + if !reflect.DeepEqual(got, want) { + t.Fatalf("resolveVerbs = %#v, want %#v", got, want) + } + + if v, err := resolveVerbs(nil, []string{"incus"}); err != nil || len(v) != 0 { + t.Fatalf("zero hops must yield zero verbs, no error; got %#v err %v", v, err) + } + + if _, err := resolveVerbs([]string{"a", "b"}, []string{"incus"}); err == nil { + t.Fatal("more hops than the host's nest depth must be an error") + } + + if _, err := resolveVerbs([]string{"x"}, []string{"bogus"}); err == nil { + t.Fatal("an unknown runtime must propagate verbFor's error") + } +}