using EdjCase.JsonRpc.Core; using System; using System.Collections.Generic; using System.Text; namespace Edjcase.JsonRpc.Router { public class ParsingResult { /// /// Successfully parsed request /// public List Requests { get; } /// /// Errors with the associated request id /// public List<(RpcId Id, RpcError Error)> Errors { get; } /// /// Flag to indicate if the request was an array vs singular /// public bool IsBulkRequest { get; } /// /// Count of total requests processed (successful and failed) /// public int RequestCount { get; } public ParsingResult(List requests, List<(RpcId, RpcError)> errors, bool isBulkRequest) { this.Requests = requests; this.Errors = errors; this.IsBulkRequest = isBulkRequest; this.RequestCount = requests.Count + errors.Count; } internal static ParsingResult FromResults(List results, bool isBulkRequest) { var requests = new List(); var errors = new List<(RpcId, RpcError)>(); foreach (RpcRequestParseResult result in results) { if (result.Error != null) { errors.Add((result.Id, result.Error)); } else { requests.Add(result.Request); } } return new ParsingResult(requests, errors, isBulkRequest); } } internal class RpcRequestParseResult { public RpcId Id { get; } public RpcRequest Request { get; } public RpcError Error { get; } private RpcRequestParseResult(RpcId id, RpcRequest request, RpcError error) { this.Id = id; this.Request = request; this.Error = error; } public static RpcRequestParseResult Success(RpcRequest request) { return new RpcRequestParseResult(request.Id, request, null); } public static RpcRequestParseResult Fail(RpcId id, RpcError error) { return new RpcRequestParseResult(id, null, error); } } }