// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Package v23cmd implements utilities for running v23 cmdline programs.
//
// The cmdline package requires a Runner that implements Run(env, args), but for
// v23 programs we'd like to implement Run(ctx, env, args) instead.  The
// initialization of the ctx is also tricky, since v23.Init() calls flag.Parse,
// but the cmdline package needs to call flag.Parse first.
//
// The RunnerFunc package-level function allows us to write run functions of the
// form Run(ctx, env, args), retaining static type-safety, and also getting the
// flag.Parse ordering right.
package v23cmd

import (
	"v.io/v23"
	"v.io/v23/context"
	"v.io/x/lib/cmdline"
)

type runner struct {
	run  func(*context.T, *cmdline.Env, []string) error
	init func() (*context.T, v23.Shutdown)
}

func (r runner) Run(env *cmdline.Env, args []string) error {
	ctx, shutdown := r.init()
	defer shutdown()
	return r.run(ctx, env, args)
}

// RunnerFunc is like cmdline.RunnerFunc, but takes a run function that includes
// a context as the first arg.  The context is created via v23.Init when Run is
// called on the returned Runner.
func RunnerFunc(run func(*context.T, *cmdline.Env, []string) error) cmdline.Runner {
	return runner{run, v23.Init}
}

// RunnerFuncWithInit is like RunnerFunc, but allows specifying the init
// function used to create the context.
//
// This is typically used to set properties on the context before it is passed
// to the run function.  E.g. you may use this to set a deadline on the context:
//
//   var cmdRoot = &cmdline.Command{
//     Runner: v23cmd.RunnerFuncWithInit(runRoot, initWithDeadline)
//     ...
//   }
//
//   func runRoot(ctx *context.T, env *cmdline.Env, args []string) error {
//     ...
//   }
//
//   func initWithDeadline() (*context.T, v23.Shutdown) {
//     ctx, shutdown := v23.Init()
//     ctx, cancel := context.WithTimeout(ctx, time.Minute)
//     return ctx, func(){ cancel(); shutdown() }
//   }
//
//   func main() {
//     cmdline.Main(cmdRoot)
//   }
//
// An alternative to the above example is to call context.WithTimeout within
// runRoot.  The advantage of using RunnerFuncWithInit is that your regular code
// can use a context with a 1 minute timeout, while your testing code can use
// v23cmd.ParseAndRunForTest to pass a context with a 10 second timeout.
func RunnerFuncWithInit(run func(*context.T, *cmdline.Env, []string) error, init func() (*context.T, v23.Shutdown)) cmdline.Runner {
	return runner{run, init}
}

// ParseAndRunForTest parses the cmd with the given env and args, and calls Run
// on the returned runner.  If the runner was created by the v23cmd package,
// calls the run function directly with the given ctx, env and args.
//
// Doesn't call v23.Init; the context initialization is up to you.
//
// Only meant to be called within tests - if used in non-test code the ordering
// of flag.Parse calls will be wrong.  The correct ordering is for cmdline.Parse
// to be called before v23.Init, but this function takes a ctx argument and then
// calls cmdline.Parse.
func ParseAndRunForTest(cmd *cmdline.Command, ctx *context.T, env *cmdline.Env, args []string) error {
	r, args, err := cmdline.Parse(cmd, env, args)
	if err != nil {
		return err
	}
	if x, ok := r.(runner); ok {
		return x.run(ctx, env, args)
	}
	return r.Run(env, args)
}
