namespace IchniOnline.Online.Network.Models { using System; [System.Serializable] public enum ResponseCode { Ok = 10000, BadRequest = 10400, Unauthorized = 10401, Forbidden = 10403, NotFound = 10404, InternalServerError = 10500 } /// /// Non-generic base class for Unity JsonUtility deserialization. /// Concrete generic GlobalResponse inherits from this. /// [System.Serializable] public abstract class GlobalResponseBase { public ResponseCode Code; public string Message; } /// /// Generic server response wrapper. JsonUtility can deserialize this to the base class, /// then cast to the concrete type for Data access. /// /// Data payload type [System.Serializable] public class GlobalResponse : GlobalResponseBase { public T Data; } /// /// Unified API result wrapper with factory methods. /// Note: JsonUtility doesn't support generic deserialization directly, /// so use GlobalResponseBase for deserialization then wrap in ApiResult. /// /// Data payload type [System.Serializable] public class ApiResult { public bool IsSuccess => Code == ResponseCode.Ok; public T Data { get; private set; } public ResponseCode Code { get; private set; } public string Message { get; private set; } public string ErrorDetail { get; private set; } private ApiResult() { } public static ApiResult Ok(T data) { return new ApiResult { Data = data, Code = ResponseCode.Ok, Message = "Success", ErrorDetail = null }; } public static ApiResult Fail(ResponseCode code, string message, string detail = null) { return new ApiResult { Data = default(T), Code = code, Message = message, ErrorDetail = detail }; } public static ApiResult Fail(int code, string message, string detail = null) { return Fail((ResponseCode)code, message, detail); } } }