package hostactors import ( "context" "encoding/json" "github.com/carlosframework/platform/internal/hostclaim" "slices" "strings" ) func (d Directory) Referenced(ctx context.Context, reference string) (bool, error) { keys, err := d.Store.List(ctx, "control/hosts/") if err != nil { return false, err } for _, key := range keys { name := strings.TrimPrefix(key, "control/hosts/") if strings.Contains(name, "/") { continue } host, ok := strings.CutSuffix(name, ".json") if !ok { return false, ErrRoster } observed, err := hostclaim.Read(ctx, d.Store, host) if err != nil { return false, err } if observed.Absent { return false, ErrRoster } c := observed.Claim _, inventory := c.Inventory[reference] if inventory || c.Op.Exec == reference || slices.Contains(c.Op.Participants, reference) || slices.Contains(c.Touched.Boxes, reference) || slices.Contains(c.Lost, reference) { return true, nil } if c.Holder != nil { if c.Holder.WriterBox == reference { return true, nil } for _, a := range c.Holder.Admissions { if a.Box == reference { return true, nil } } } } keys, err = d.Store.List(ctx, "control/edges/") if err != nil { return false, err } for _, key := range keys { raw, _, err := d.Store.Get(ctx, key) if err != nil { return false, err } var edge struct { BoxID string `json:"box_id"` } if json.Unmarshal(raw, &edge) != nil { return false, ErrRoster } if edge.BoxID == reference || key == "control/edges/"+reference+".json" { return true, nil } } return false, nil }