package com.yanzuoguang.util.base;

import com.yanzuoguang.util.helper.StringHelper;

import java.util.HashMap;
import java.util.Map;

/**
 * 遍历对象和值
 *
 * @author 颜佐光
 */
public class ObjectEach {
    /**
     * 遍历对象
     *
     * @param target   对象
     * @param consumer 消费者,其中包含名称,值,方法(map时为空)
     */
    public static void each(Object target, ObjectEachItem<String, Object, MethodField> consumer) {
        if (target instanceof Map<?,?>) {
            eachMap((Map<?,?>) target, consumer);
        } else {
            eachObject(target, consumer);
        }
    }

    /**
     * 遍历map对象
     *
     * @param target   目标对象
     * @param consumer 遍历的字段,值,方法
     */
    private static void eachMap(Map<?,?> target, ObjectEachItem<String, Object, MethodField> consumer) {
        for (Object key : target.keySet()) {
            Object fromValue = target.get(key);
            consumer.accept(StringHelper.toString(key), fromValue, null);
        }
    }

    /**
     * 遍历对象
     *
     * @param target   目标对象
     * @param consumer 遍历的字段,值,方法
     */
    private static void eachObject(Object target, ObjectEachItem<String, Object, MethodField> consumer) {
        HashMap<String, MethodField> mapField = ObjectHelper.getTypeField(target.getClass());
        for (Map.Entry<String, MethodField> field : mapField.entrySet()) {
            String name = field.getValue().getName();
            Object fromValue = ObjectHelper.get(target, name);
            consumer.accept(name, fromValue, field.getValue());
        }
    }
}