package io.vertx.redis.client.impl.types;
import io.vertx.redis.client.Response;
import io.vertx.redis.client.ResponseType;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public final class AttributeType implements Multi {
public static AttributeType create(long length) {
return new AttributeType(new Response[(int) length * 2]);
}
private final Map<String, Response> map;
private final Response[] replies;
private int count;
private String key;
private AttributeType(Response[] replies) {
this.replies = replies;
this.count = 0;
this.map = new HashMap<>();
}
@Override
public ResponseType type() {
return ResponseType.ATTRIBUTE;
}
public void add(Response reply) {
if (count % 2 == 0) {
key = reply.toString();
} else {
if (key != null) {
map.put(key, reply);
}
}
this.replies[this.count++] = reply;
}
public boolean complete() {
return count == replies.length;
}
@Override
public Response get(int index) {
return replies[index];
}
@Override
public Response get(String key) {
return map.get(key);
}
@Override
public Set<String> getKeys() {
return map.keySet();
}
@Override
public int size() {
return replies.length;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append('{');
boolean more = false;
for (Map.Entry<String, Response> kv : map.entrySet()) {
if (more) {
sb.append(", ");
}
String key = kv.getKey();
if (key == null) {
sb.append("null");
} else {
sb.append(key);
}
sb.append(':');
Response value = kv.getValue();
if (value == null) {
sb.append("null");
} else {
sb.append(value.toString());
}
more = true;
}
sb.append('}');
return sb.toString();
}
@Override
public Iterator<Response> iterator() {
return new Iterator<Response>() {
private int idx = 0;
@Override
public boolean hasNext() {
return idx < replies.length;
}
@Override
public Response next() {
final Response value = replies[idx];
idx += 2;
return value;
}
};
}
}