public override void Write(Utf8JsonWriter writer, ApiTaskResult <TResult> value, JsonSerializerOptions options) { var dto = ToDto(); if (value.TryGetTaskError(out var error)) { dto.ApiError = error; } else if (value.TryGetSuccessResult(out var successResult)) { dto.TaskResult = successResult; } JsonSerializer.Serialize(writer, dto, options); ApiTaskResultDto ToDto() { return(new ApiTaskResultDto { Id = value.Id, TaskState = value.TaskState, TaskType = value.TaskType, }); } }
private ApiTaskResult <TResult, TFailureResult> DeserializeResult( JsonDocument jsonDocument, string?taskStateValue, Guid taskId, Urn?taskType, JsonSerializerOptions?options) { var resultJson = jsonDocument.RootElement.GetProperty(propNames.TaskResultPropName.AsUtf8()).GetRawText(); Exception?failureSerializationError = null; try { var failureResult = DeserializeAs <TFailureResult>(resultJson, propNames.TaskResultPropName, taskStateValue, options); if (!failureResult.IsEmpty) { return(ApiTaskResult <TResult, TFailureResult> .FailureResult(failureResult, taskId, taskType)); } } catch (Exception ex) { failureSerializationError = ex; } var successResult = DeserializeAs <TResult>(resultJson, propNames.TaskResultPropName, taskStateValue, options); if (successResult.IsEmpty && failureSerializationError is not null) { throw failureSerializationError; } return(ApiTaskResult <TResult, TFailureResult> .Success(successResult, taskId, taskType)); }
public override ApiTaskResult <TResult, TFailureResult> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { using var jsonDocument = JsonDocument.ParseValue(ref reader); var taskId = jsonDocument.RootElement.GetProperty(propNames.IdPropName.AsUtf8()).GetGuid(); var taskStateValue = jsonDocument.RootElement.GetProperty(propNames.TaskStatePropName.AsUtf8()).GetString(); var taskState = (ApiTaskState)Enum.Parse(typeof(ApiTaskState), taskStateValue !, true); var taskTypeValue = jsonDocument.RootElement.GetProperty(propNames.TaskTypePropName.AsUtf8()).GetString(); var taskType = taskTypeValue == null ? null : Urn.Parse(taskTypeValue); switch (taskState) { case ApiTaskState.Running: return(ApiTaskResult <TResult, TFailureResult> .Running(taskId, taskType)); case ApiTaskState.Succeed: return(DeserializeResult(jsonDocument, taskStateValue, taskId, taskType, options)); case ApiTaskState.Failed: var errorJson = jsonDocument.RootElement.GetProperty(propNames.ApiErrorPropName.AsUtf8()).GetRawText(); var error = DeserializeAs <ApiError>(errorJson, propNames.ApiErrorPropName, taskStateValue, options); return(ApiTaskResult <TResult, TFailureResult> .TaskFailure(error, taskId, taskType)); default: throw Errors.UnexpectedEnumMember(nameof(taskState), taskState); } }
public void Success_should_fail_if_given_empty_result() { var id = Guid.NewGuid(); var taskType = new Urn("nid", "nss"); Action action = () => ApiTaskResult <SuccessResult, FailureResult> .Success(SuccessResult.Empty, id, taskType); action.Should().Throw <ArgumentException>(); }
public void TryGetTaskError_should_return_error_if_api_task_result_is_failure() { var taskResult = ApiTaskResult <SuccessResult, FailureResult> .FailureResult(new FailureResult(), Guid.NewGuid(), new Urn("nid", "nss")); var success = taskResult.TryGetTaskError(out var result); success.Should().BeFalse(); result.Should().BeNull(); }
public void TryGetTaskError_should_return_task_error_if_api_task_result_is_api_error() { var apiError = AnApiError; var taskResult = ApiTaskResult <SuccessResult, FailureResult> .TaskFailure(apiError, Guid.NewGuid(), new Urn("nid", "nss")); var success = taskResult.TryGetTaskError(out var result); success.Should().BeTrue(); result.Should().Be(apiError); }
public void TryGetFailureResult_should_return_failure_result_if_api_task_result_is_failure() { var failureResult = new FailureResult(); var taskResult = ApiTaskResult <SuccessResult, FailureResult> .FailureResult(failureResult, Guid.NewGuid(), new Urn("nid", "nss")); var success = taskResult.TryGetFailureResult(out var result); success.Should().BeTrue(); result.Should().Be(failureResult); }
public void TryGetSuccessResult_should_return_success_result_if_api_task_result_is_successful() { var successResult = new SuccessResult(); var taskResult = ApiTaskResult <SuccessResult> .Success(successResult, Guid.NewGuid(), new Urn("nid", "nss")); var success = taskResult.TryGetSuccessResult(out var result); success.Should().BeTrue(); result.Should().Be(successResult); }
public void FailureResult_should_create_result_in_the_failed_state() { var id = Guid.NewGuid(); var taskType = new Urn("nid", "nss"); var expectedDto = new ExpectedResult { Id = id, TaskType = taskType, TaskState = ApiTaskState.Failed }; var result = ApiTaskResult <SuccessResult, FailureResult> .FailureResult(new FailureResult(), id, taskType); result.Should().BeEquivalentTo(expectedDto); }
public void Running_should_create_result_in_the_running_state() { var id = Guid.NewGuid(); var taskType = new Urn("nid", "nss"); var expectedDto = new ExpectedResult { Id = id, TaskType = taskType, TaskState = ApiTaskState.Running }; var result = ApiTaskResult <SuccessResult> .Running(id, taskType); result.Should().BeEquivalentTo(expectedDto); }
public void ConvertToSingleApiResult_should_convert_running_result_to_running_result() { var id = Guid.NewGuid(); var taskType = new Urn("nid", "nss"); var expectedDto = new ExpectedResult { Id = id, TaskType = taskType, TaskState = ApiTaskState.Running }; var taskResult = ApiTaskResult <SuccessResult, FailureResult> .Running(id, taskType); var oneResultApiResult = taskResult.ConvertToSingleApiResult( x => x.Value, x => new ApiError(HttpStatusCode.Forbidden, x.Value.ToString()) ); oneResultApiResult.Should().BeEquivalentTo(expectedDto); oneResultApiResult.TryGetSuccessResult(out _).Should().BeFalse(); }
public override ApiTaskResult <TResult> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { using var jsonDocument = JsonDocument.ParseValue(ref reader); var taskId = jsonDocument.RootElement.GetProperty(propNames.IdPropName.AsUtf8()).GetGuid(); var taskStateValue = jsonDocument.RootElement.GetProperty(propNames.TaskStatePropName.AsUtf8()).GetString(); var taskState = (ApiTaskState)Enum.Parse(typeof(ApiTaskState), taskStateValue !, true); var taskTypeValue = jsonDocument.RootElement.GetProperty(propNames.TaskTypePropName.AsUtf8()).GetString(); var taskType = taskTypeValue == null ? null : Urn.Parse(taskTypeValue); switch (taskState) { case ApiTaskState.Running: return(ApiTaskResult <TResult> .Running(taskId, taskType)); case ApiTaskState.Succeed: var resultJson = jsonDocument.RootElement.GetProperty(propNames.TaskResultPropName.AsUtf8()).GetRawText(); var successResult = DeserializeAs <TResult>(resultJson, propNames.TaskResultPropName, taskStateValue); return(ApiTaskResult <TResult> .Success(successResult, taskId, taskType)); case ApiTaskState.Failed: var errorJson = jsonDocument.RootElement.GetProperty(propNames.ApiErrorPropName.AsUtf8()).GetRawText(); var error = DeserializeAs <ApiError>(errorJson, propNames.ApiErrorPropName, taskStateValue); return(ApiTaskResult <TResult> .TaskFailure(error, taskId, taskType)); default: throw Errors.UnexpectedEnumMember(nameof(taskState), taskState); } T DeserializeAs <T>(string json, in Utf8String propName, string?taskStatePropValue) { return(JsonSerializer.Deserialize <T>(json, options) ?? throw Errors.JsonPropertyCannotBeNullIfAnotherPropertyHasValue( propName.ToString(), propNames.TaskStatePropName.ToString(), taskStatePropValue)); } }
public void ConvertToSingleApiResult_should_convert_task_error_result_to_api_error() { var id = Guid.NewGuid(); var taskType = new Urn("nid", "nss"); var expectedDto = new ExpectedResult { Id = id, TaskType = taskType, TaskState = ApiTaskState.Failed }; var expectedApiError = new ApiError(HttpStatusCode.Forbidden, "an error"); var taskResult = ApiTaskResult <SuccessResult, FailureResult> .TaskFailure(expectedApiError, id, taskType); var oneResultApiResult = taskResult.ConvertToSingleApiResult( x => x.Value, x => new ApiError(HttpStatusCode.Forbidden, x.Value.ToString()) ); oneResultApiResult.Should().BeEquivalentTo(expectedDto); oneResultApiResult.TryGetTaskError(out var apiError).Should().BeTrue(); apiError.Should().BeEquivalentTo(expectedApiError); }
public void Should_serialize_deserialize_task_result_of_one_results_in_running_state(ApiTaskResult <SuccessResult> taskResult) { Should_serialize_deserialize_as_expected(taskResult); }