private static TryCatch <IQueryPipelineStage> MonadicCreate( int takeCount, CosmosElement requestContinuationToken, CancellationToken cancellationToken, MonadicCreatePipelineStage monadicCreatePipelineStage) { if (takeCount < 0) { throw new ArgumentException($"{nameof(takeCount)}: {takeCount} must be a non negative number."); } if (monadicCreatePipelineStage == null) { throw new ArgumentNullException(nameof(monadicCreatePipelineStage)); } TakeContinuationToken takeContinuationToken; if (requestContinuationToken != null) { if (!TakeContinuationToken.TryParse(requestContinuationToken, out takeContinuationToken)) { return(TryCatch <IQueryPipelineStage> .FromException( new MalformedContinuationTokenException( $"Malformed {nameof(TakeContinuationToken)}: {requestContinuationToken}."))); } } else { takeContinuationToken = new TakeContinuationToken(takeCount, sourceToken: null); } if (takeContinuationToken.TakeCount > takeCount) { return(TryCatch <IQueryPipelineStage> .FromException( new MalformedContinuationTokenException( $"{nameof(TakeContinuationToken.TakeCount)} in {nameof(TakeContinuationToken)}: {requestContinuationToken}: {takeContinuationToken.TakeCount} can not be greater than the limit count in the query: {takeCount}."))); } TryCatch <IQueryPipelineStage> tryCreateSource = monadicCreatePipelineStage(takeContinuationToken.SourceToken, cancellationToken); if (tryCreateSource.Failed) { return(tryCreateSource); } IQueryPipelineStage stage = new ComputeTakeQueryPipelineStage( tryCreateSource.Result, cancellationToken, takeContinuationToken.TakeCount); return(TryCatch <IQueryPipelineStage> .FromResult(stage)); }
public static async Task <TryCatch <IDocumentQueryExecutionComponent> > TryCreateAsync( int takeCount, CosmosElement requestContinuationToken, Func <CosmosElement, Task <TryCatch <IDocumentQueryExecutionComponent> > > tryCreateSourceAsync) { if (takeCount < 0) { throw new ArgumentException($"{nameof(takeCount)}: {takeCount} must be a non negative number."); } if (tryCreateSourceAsync == null) { throw new ArgumentNullException(nameof(tryCreateSourceAsync)); } TakeContinuationToken takeContinuationToken; if (requestContinuationToken != null) { if (!TakeContinuationToken.TryParse(requestContinuationToken, out takeContinuationToken)) { return(TryCatch <IDocumentQueryExecutionComponent> .FromException( new MalformedContinuationTokenException($"Malformed {nameof(TakeContinuationToken)}: {requestContinuationToken}."))); } } else { takeContinuationToken = new TakeContinuationToken(takeCount, sourceToken: null); } if (takeContinuationToken.TakeCount > takeCount) { return(TryCatch <IDocumentQueryExecutionComponent> .FromException( new MalformedContinuationTokenException($"{nameof(TakeContinuationToken.TakeCount)} in {nameof(TakeContinuationToken)}: {requestContinuationToken}: {takeContinuationToken.TakeCount} can not be greater than the limit count in the query: {takeCount}."))); } return((await tryCreateSourceAsync(takeContinuationToken.SourceToken)) .Try <IDocumentQueryExecutionComponent>((source) => new ComputeTakeDocumentQueryExecutionComponent( source, takeContinuationToken.TakeCount))); }