/// <summary> /// Runs an SCL sequence without injecting any metadata /// </summary> public async Task <Result <Unit, IError> > RunSequence( string text, IReadOnlyDictionary <string, object> sequenceMetadata, CancellationToken cancellationToken) { var stepResult = SCLParsing.TryParseStep(text) .Bind(x => x.TryFreeze(TypeReference.Any.Instance, _stepFactoryStore)) .Map(ConvertToUnitStep); if (stepResult.IsFailure) { return(stepResult.ConvertFailure <Unit>()); } using var loggingScope = _logger.BeginScope(TopLevelLoggingScope); var stateMonad = new StateMonad( _logger, _settings, _stepFactoryStore, _externalContext, sequenceMetadata ); LogSituation.SequenceStarted.Log(stateMonad, null); var connectorSettings = _settings.Entity.TryGetValue(SCLSettings.ConnectorsKey); if (connectorSettings.HasValue) { LogSituation.ConnectorSettings.Log( stateMonad, null, connectorSettings.Value.Serialize() ); } var runResult = await stepResult.Value.Run(stateMonad, cancellationToken); await stateMonad.DisposeAsync(); _logger.LogSituation( LogSituation.SequenceCompleted, null, sequenceMetadata, Array.Empty <object?>() ); return(runResult); }