// Copyright (c) Shenyang Leading Edge Intelligent Technology Co., Ltd. All rights reserved.

package container

import (
	"errors"
	"fmt"
)

// 组件句柄管理器
type HandlerManager struct {
	// 组件句柄映射: map[接口类型]组件句柄
	handlerMapping map[Interface]ComponentHandler
}

// 创建组件句柄管理器
// 参数
// 1.会话标识
// 2.用户信息
// 3.服务映射: map[接口类型]组件句柄
// 返回值:
// 1.会话
// 2.错误
func NewHandlerManager(handlerMapping map[Interface]ComponentHandler) (*HandlerManager, error) {
	if len(handlerMapping) > 0 {
		for interfaceType, handler := range handlerMapping {
			if interfaceType == nil {
				return nil, errors.New(fmt.Sprintf("组件接口不能为空!"))
			}
			if handler == nil {
				return nil, errors.New(fmt.Sprintf("组件句柄不能为空!"))
			}
		}
	}
	return &HandlerManager{handlerMapping}, nil
}

// 获取指定接口的组件句柄
// 参数
// 1.服务接口类型
// 返回值:
// 1.组件句柄
func (session *HandlerManager) Handler(interfaceType Interface) ComponentHandler {
	if interfaceType == nil {
		return nil
	}
	componentHandler, ok := session.handlerMapping[interfaceType]
	if !ok {
		return nil
	}
	return componentHandler
}
