Пример #1
0
 /// <summary>
 /// Creates a new RubyScriptStepFactory.
 /// </summary>
 protected RubyScriptStepFactory()
 {
     _lazyRubyFunction
         = new Lazy <RubyFunction <TOutput> >(
               () => new RubyFunction <TOutput>(
                   FunctionName,
                   RubyFunctionText,
                   RubyFunctionParameter.GetRubyFunctionParameters <TStep>(),
                   RequiredNuixVersion,
                   RequiredFeatures,
                   RequiredHelpers !
                   )
               );
 }
Пример #2
0
        /// <inheritdoc />
        protected override async Task <Result <StringStream, IError> > Run(
            IStateMonad stateMonad,
            CancellationToken cancellationToken)
        {
            //var isAdmin = IsCurrentProcessAdmin();
            //var isLinux = IsLinux;
            //if(isAdmin &&!isLinux)
            //    return new SingleError("You cannot run arbitrary Nuix Scripts as Administrator", ErrorCode.ExternalProcessError, new StepErrorLocation(this));

            var functionName = await FunctionName.Run(stateMonad, cancellationToken)
                               .Map(x => x.GetStringAsync())
            ;

            if (functionName.IsFailure)
            {
                return(functionName.ConvertFailure <StringStream>());
            }

            var scriptText = await ScriptText.Run(stateMonad, cancellationToken)
                             .Map(x => x.GetStringAsync());

            if (scriptText.IsFailure)
            {
                return(scriptText.ConvertFailure <StringStream>());
            }

            var parameters = await Parameters.Run(stateMonad, cancellationToken);

            if (parameters.IsFailure)
            {
                return(parameters.ConvertFailure <StringStream>());
            }

            var nuixConnection = await stateMonad.GetOrCreateNuixConnection(this, false);

            if (nuixConnection.IsFailure)
            {
                return(nuixConnection.ConvertFailure <StringStream>()
                       .MapError(x => x.WithLocation(this)));
            }

            var rubyFunctionParameters = parameters.Value
                                         .Select(x => new RubyFunctionParameter(ConvertString(x.Name), x.Name, true))
                                         .ToList();

            var parameterDict = parameters.Value
                                .ToDictionary(
                x =>
                new RubyFunctionParameter(ConvertString(x.Name), x.Name, true),
                x => x.BestValue.ObjectValue
                )
                                .Where(x => x.Value != null)
                                .ToDictionary(x => x.Key, x => x.Value !);

            if (EntityStreamParameter != null)
            {
                var streamResult = await EntityStreamParameter.Run(stateMonad, cancellationToken);

                if (streamResult.IsFailure)
                {
                    return(streamResult.ConvertFailure <StringStream>());
                }

                const string streamParameter = "datastream";

                var parameter = new RubyFunctionParameter(
                    ConvertString(streamParameter),
                    streamParameter,
                    true
                    );

                rubyFunctionParameters.Add(parameter);

                parameterDict.Add(parameter, streamResult.Value);
            }

            var function = new RubyFunction <string>(
                ConvertString(functionName.Value),
                scriptText.Value,
                rubyFunctionParameters,
                new Version(5, 0),
                ArraySegment <NuixFeature> .Empty
                );

            var runResult = await nuixConnection.Value.RunFunctionAsync(
                stateMonad,
                this,
                function,
                parameterDict,
                CasePathParameter.IgnoresOpenCase.Instance,
                cancellationToken
                )
                            .Map(x => new StringStream(x));

            if (runResult.IsFailure)
            {
                return(runResult.MapError(x => x.WithLocation(this)).ConvertFailure <StringStream>());
            }

            return(runResult.Value);
        }