func()

in command-runner/internal/containers/finch/finch_run.go [164:203]


func (cr *finchContainer) find() common.Executor {
	return func(ctx context.Context) error {
		if cr.id != "" {
			return nil
		}
		rout, rerr, err := cr.f.RunWithoutStdio(ctx, "container", "ls", "--all", "--format", "{{json .}}")
		if err != nil {
			return fmt.Errorf("failed to list containers: %w\n%s", err, rerr)
		}

		scanner := bufio.NewScanner(bytes.NewReader(rout))
		for scanner.Scan() {
			cs := new(finchContainerSpec)
			if err := json.Unmarshal(scanner.Bytes(), cs); err != nil {
				return fmt.Errorf("failed unmarshalling container spec: %w", err)
			}
			names := make([]string, 0)
			switch typedNames := cs.Names.(type) {
			case []interface{}:
				for _, inf := range typedNames {
					names = append(names, inf.(string))
				}
			case []string:
				names = typedNames
			case string:
				names = []string{typedNames}
			default:
				return fmt.Errorf("invalid names type: %T", cs.Names)
			}
			log.Ctx(ctx).Debug().Msgf("got back container %+v with names %v", cs, names)
			if slices.Contains(names, cr.input.Name) {
				cr.id = cs.ID
				return nil
			}
		}

		cr.id = ""
		return nil
	}
}