/*
Copyright (c) 2015 VMware, Inc. All Rights Reserved.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package task

import "github.com/vmware/govmomi/vim25/types"

type Error struct {
	*types.LocalizedMethodFault
}

// Error returns the task's localized fault message.
func (e Error) Error() string {
	return e.LocalizedMethodFault.LocalizedMessage
}

func (e Error) Fault() types.BaseMethodFault {
	return e.LocalizedMethodFault.Fault
}
