package org.cnodejs.android.md.model.entity;
import android.support.annotation.NonNull;
import com.google.gson.JsonSyntaxException;
import com.google.gson.annotations.SerializedName;
import org.cnodejs.android.md.model.util.EntityUtils;
import org.cnodejs.android.md.util.FormatUtils;
import java.io.IOException;
import java.net.ConnectException;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
import retrofit2.Response;
public class Result {
protected boolean success;
public boolean isSuccess() {
return success;
}
public static class Data<T> extends Result {
private T data;
public T getData() {
return data;
}
}
public static class Error extends Result {
@SerializedName("error_msg")
private String errorMessage;
public String getErrorMessage() {
return errorMessage;
}
}
public static <T extends Result> Error buildError(@NonNull Response<T> response) {
try {
return EntityUtils.gson.fromJson(response.errorBody().string(), Error.class);
} catch (IOException | JsonSyntaxException e) {
Error error = new Error();
error.success = false;
switch (response.code()) {
case 400:
error.errorMessage = "请求参数有误";
break;
case 403:
error.errorMessage = "请求被拒绝";
break;
case 404:
error.errorMessage = "资源未找到";
break;
case 405:
error.errorMessage = "请求方式不被允许";
break;
case 408:
error.errorMessage = "请求超时";
break;
case 422:
error.errorMessage = "请求语义错误";
break;
case 500:
error.errorMessage = "服务器逻辑错误";
break;
case 502:
error.errorMessage = "服务器网关错误";
break;
case 504:
error.errorMessage = "服务器网关超时";
break;
default:
error.errorMessage = response.message();
break;
}
return error;
}
}
public static Error buildError(@NonNull Throwable t) {
Error error = new Error();
error.success = false;
if (t instanceof UnknownHostException || t instanceof ConnectException) {
error.errorMessage = "网络无法连接";
} else if (t instanceof SocketTimeoutException) {
error.errorMessage = "网络访问超时";
} else if (t instanceof JsonSyntaxException) {
error.errorMessage = "响应数据格式错误";
} else {
error.errorMessage = "未知错误:" + t.getLocalizedMessage();
}
return error;
}
public static class Login extends Result {
private String id;
@SerializedName("loginname")
private String loginName;
@SerializedName("avatar_url")
private String avatarUrl;
public String getId() {
return id;
}
public String getLoginName() {
return loginName;
}
public String getAvatarUrl() { // 修复头像地址的历史遗留问题
return FormatUtils.getCompatAvatarUrl(avatarUrl);
}
}
public static class CreateTopic extends Result {
@SerializedName("topic_id")
private String topicId;
public String getTopicId() {
return topicId;
}
}
public static class ReplyTopic extends Result {
@SerializedName("reply_id")
private String replyId;
public String getReplyId() {
return replyId;
}
}
public static class UpReply extends Result {
private Reply.UpAction action;
public Reply.UpAction getAction() {
return action == null ? Reply.UpAction.down : action;
}
}
}