You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: convert.go
    path of file: ./repos/moby/libcontainerd/shimopts
    
    the code of the file until where you have to start completion: package shimopts

import (
	runhcsoptions "github.com/Microsoft/hcsshim/cmd/containerd-shim-runhcs-v1/options"
	runtimeoptions "github.com/containerd/containerd/pkg/runtimeoptions/v1"
	"github.com/containerd/containerd/plugin"
	runcoptions "github.com/containerd/containerd/runtime/v2/runc/options"
	"github.com/pelletier/go-toml"
)

// Generate converts opts into a runtime options value for the runtimeType which
// can be passed into containerd.
func Generate(runtimeType string, opts map[string]interface{}) (in
    
func Generate(runtimeType string, opts map[string]interface{}) (interface{}, error) {
	// This is horrible, but we have no other choice. The containerd client
	// can only handle options values which can be marshaled into a
	// typeurl.Any. And we're in good company: cri-containerd handles shim
	// options in the same way.
	var out interface{}
	switch runtimeType {
	case plugin.RuntimeRuncV1, plugin.RuntimeRuncV2:
		out = &runcoptions.Options{}
	case "io.containerd.runhcs.v1":
		out = &runhcsoptions.Options{}
	default:
		out = &runtimeoptions.Options{}
	}

	// We can't use mergo.Map as it is too strict about type-assignability
	// with numeric types.
	tree, err := toml.TreeFromMap(opts)
	if err != nil {
		return nil, err
	}
	if err := tree.Unmarshal(out); err != nil {
		return nil, err
	}
	return out, nil
}