func submain()

in testing/gimmeproj/main.go [123:194]


func submain() error {
	ctx := context.Background()

	usage := errors.New(`
Usage:
	gimmeproj -project=[meta project ID] command
	gimmeproj -project=[meta project ID] -output=list status

Commands:
	lease [duration]    Leases a project for a given duration. Prints the project ID to stdout.
	done [project ID]   Returns a project to the pool.
	version             Prints the version of gimmeproj.

Administrative commands:
	pool-add [project ID]       Adds a project to the pool.
	pool-rm  [project ID]       Removes a project from the pool.
	status                      Displays the current status of the meta project. Respects -output.
`)

	if flag.Arg(0) == "version" {
		fmt.Printf("gimmeproj %s@%s; built at %s\n", buildSource, version, buildDate)
		return nil
	}

	if *metaProject == "" {
		fmt.Fprintln(os.Stderr, "-project flag is required.")
		return usage
	}

	if len(flag.Args()) == 0 {
		fmt.Fprintln(os.Stderr, "Missing command.")
		return usage
	}

	var err error
	datastore, err = ds.NewClient(ctx, *metaProject)
	if err != nil {
		return fmt.Errorf("datastore.NewClient: %w", err)
	}

	switch flag.Arg(0) {
	case "help":
		fmt.Fprintln(os.Stderr, usage.Error())
		return nil
	case "lease":
		// When leasing, keep trying until we reach our configured timeout
		ctx, cancel := context.WithTimeout(ctx, *waitTime)
		defer cancel()
		for ctx.Err() == nil {
			err := lease(ctx, flag.Arg(1))
			if err == nil {
				return err
			} else if errors.Is(err, ErrNoProjects) {
				log.Printf("Temporary error: %v\n", err)
				time.Sleep(30 * time.Second)
			} else {
				return err
			}
		}
		return ctx.Err()
	case "pool-add":
		return addToPool(ctx, flag.Arg(1))
	case "pool-rm":
		return removeFromPool(ctx, flag.Arg(1))
	case "status":
		return status(ctx)
	case "done":
		return done(ctx, flag.Arg(1))
	}
	fmt.Fprintln(os.Stderr, "Unknown command.")
	return usage
}