vsphere/internal/helper/folder/folder_helper.go
func folderFromObject(client *govmomi.Client, obj interface{}, folderType RootPathParticle, relative string) (*object.Folder, error) {
	// If we are using this for anything else other than the root folder on ESXi,
	// return an error.
	if err := viapi.ValidateVirtualCenter(client); err != nil && relative != "" {
		return nil, errors.New("folders are only supported vCenter only")
	}
	var p string
	var err error
	switch o := obj.(type) {
	case *object.VmwareDistributedVirtualSwitch:
		p, err = RootPathParticleNetwork.PathFromNewRoot(o.InventoryPath, folderType, relative)
	case *object.Datastore:
		p, err = RootPathParticleDatastore.PathFromNewRoot(o.InventoryPath, folderType, relative)
	case *object.StoragePod:
		p, err = RootPathParticleDatastore.PathFromNewRoot(o.InventoryPath, folderType, relative)
	case *object.HostSystem:
		p, err = RootPathParticleHost.PathFromNewRoot(o.InventoryPath, folderType, relative)
	case *object.ResourcePool:
		p, err = RootPathParticleHost.PathFromNewRoot(o.InventoryPath, folderType, relative)
	case *object.ComputeResource:
		p, err = RootPathParticleHost.PathFromNewRoot(o.InventoryPath, folderType, relative)
	case *object.ClusterComputeResource:
		p, err = RootPathParticleHost.PathFromNewRoot(o.InventoryPath, folderType, relative)
	case *object.VirtualMachine:
		p, err = RootPathParticleVM.PathFromNewRoot(o.InventoryPath, folderType, relative)
	default:
		return nil, fmt.Errorf("unsupported object type %T", o)
	}
	if err != nil {
		return nil, err
	}
	return FromAbsolutePath(client, p)
}
func folderFromObject(client *govmomi.Client, obj interface{}, folderType RootPathParticle, relative string) (*object.Folder, error) {
	// If we are using this for anything else other than the root folder on ESXi,
	// return an error.
	if err := viapi.ValidateVirtualCenter(client); err != nil && relative != "" {
		return nil, errors.New("folders are only supported vCenter only")
	}
	var p string
	var err error
	switch o := obj.(type) {
	case *object.VmwareDistributedVirtualSwitch:
		p, err = RootPathParticleNetwork.PathFromNewRoot(o.InventoryPath, folderType, relative)
	case *object.Datastore:
		p, err = RootPathParticleDatastore.PathFromNewRoot(o.InventoryPath, folderType, relative)
	case *object.StoragePod:
		p, err = RootPathParticleDatastore.PathFromNewRoot(o.InventoryPath, folderType, relative)
	case *object.HostSystem:
		p, err = RootPathParticleHost.PathFromNewRoot(o.InventoryPath, folderType, relative)
	case *object.ResourcePool:
		p, err = RootPathParticleHost.PathFromNewRoot(o.InventoryPath, folderType, relative)
	case *object.ComputeResource:
		p, err = RootPathParticleHost.PathFromNewRoot(o.InventoryPath, folderType, relative)
	case *object.ClusterComputeResource:
		p, err = RootPathParticleHost.PathFromNewRoot(o.InventoryPath, folderType, relative)
	case *object.VirtualMachine:
		p, err = RootPathParticleVM.PathFromNewRoot(o.InventoryPath, folderType, relative)
	default:
		return nil, fmt.Errorf("unsupported object type %T", o)
	}
	if err != nil {
		return nil, err
	}
	return FromAbsolutePath(client, p)
}
// folderFromObject returns an *object.Folder from a given object of specific
// types, and relative path of a type defined in folderType. If no such folder
// is found, an appropriate error will be returned.
//
// The list of supported object types will grow as the provider supports more
// resources.