using MessagePack; using Newtonsoft.Json; using System.Application.Properties; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Threading; using System.Threading.Tasks; namespace System.Application.Models { public static class ApiResponse { static IApiResponse ClientDeserializeFail() => Code(ApiResponseCode.ClientDeserializeFail); static Type GetDeserializeType() { if (typeof(T) == typeof(object)) return typeof(ApiResponseImpl); return typeof(ApiResponseImpl); } public static IApiResponse Deserialize( JsonSerializer jsonSerializer, JsonReader jsonReader) { var type = GetDeserializeType(); var obj = (IApiResponse?)jsonSerializer.Deserialize(jsonReader, type); return obj ?? ClientDeserializeFail(); } public static async ValueTask> DeserializeAsync( Stream stream, CancellationToken cancellationToken) { var type = GetDeserializeType(); var obj = await MessagePackSerializer.DeserializeAsync( type, stream, cancellationToken: cancellationToken); return (IApiResponse?)obj ?? ClientDeserializeFail(); } public static bool TryGetContent( this IApiResponse response, [NotNullWhen(true)] out T? content) { content = response.Content; return response.IsSuccess && content != null; } public static string GetMessage(ApiResponseCode code) { if (code == ApiResponseCode.Unauthorized) { return SR.ApiResponseCode_Unauthorized; } return string.Format(SR.ServerError_, (int)code); } public static string GetMessage(IApiResponse response) { #pragma warning disable CS0618 // 类型或成员已过时 var message = response.Message; #pragma warning restore CS0618 // 类型或成员已过时 if (string.IsNullOrWhiteSpace(message)) { return GetMessage(response.Code); } else { return message; } } public static IApiResponse Code(ApiResponseCode code, string? message = null) => new ApiResponseImpl { Code = code, Message = message, }; static readonly Lazy okRsp = new Lazy(() => Code(ApiResponseCode.OK)); public static IApiResponse Ok() => okRsp.Value; public static IApiResponse Code( ApiResponseCode code, string? message = null, T? content = default) => new ApiResponseImpl { Code = code, Message = message, Content = content, }; public static IApiResponse Ok(T? content = default) => Code(ApiResponseCode.OK, content: content); public static IApiResponse Fail() => Code(ApiResponseCode.Fail); public static IApiResponse Fail(string? message = null) => Code(ApiResponseCode.Fail, message); } }