@Override
    public Object fromProto(Value any) {
        switch (any.getKindCase()) {
            case NULL_VALUE:
                return null;
            case BOOL_VALUE:
                return any.getBoolValue();
            case NUMBER_VALUE:
                return any.getNumberValue();
            case STRING_VALUE:
                return any.getStringValue();
            case STRUCT_VALUE:
                Struct struct = any.getStructValue();
                Map<String, Object> map = new HashMap<>();
                for (Map.Entry<String, Value> pair : struct.getFieldsMap().entrySet()) {
                    map.put(pair.getKey(), fromProto(pair.getValue()));
                }
                return map;
            case LIST_VALUE:
                List<Object> list = new ArrayList<>();
                for (Value val : any.getListValue().getValuesList()) {
                    list.add(fromProto(val));
                }
                return list;
            default:
                throw new ClassCastException("unset Value element: "+any);
        }
    }
Convert a ProtoBuf {@link Value} message into its native Java object
equivalent.

See {@link ProtoMapper#toProto(Object)} for the reverse mapping and the
possible values that can be returned from this method.

@param any an instance of a ProtoBuf {@link Value} message
@return a native Java object representing the value
grpc/src/main/java/com/netflix/conductor/grpc/ProtoMapper.java