Example #1
0
        public static Arguments FromValue(Value value, bool returnNullIfNotExecutable = true)
        {
            value = value.Self;
            if (value is OTuple tuple)
            {
                Assert(tuple.Length > 1, LOCATION, "Tuple must have at least two values");
                var innerValue = tuple[0];
                if (tuple[1] is Lambda innerLambda)
                {
                    return(new Arguments(innerValue, innerLambda.Block, innerLambda.Parameters));
                }

                Throw(LOCATION, "Second value must be a lambda");
            }

            if (value is MessagePath chain)
            {
                var builder = new CodeBuilder();
                builder.Variable(State.DefaultParameterNames.ValueVariable);
                builder.Apply();
                builder.Value(chain);
                var block = builder.Block;
                return(new Arguments(new NullBlock(), block));
            }

            if (value is Lambda lambda)
            {
                return new Arguments(new NullBlock(), lambda.Block, lambda.Parameters)
                       {
                           Splatting = lambda.Splatting
                       }
            }
            ;

            if (value is Block aBlock)
            {
                return(new Arguments(new NullBlock(), aBlock, new NullParameters()));
            }
            if (returnNullIfNotExecutable)
            {
                return(null);
            }

            var argumentsBlock = PushValue(value);

            return(new Arguments(argumentsBlock));
        }
Example #2
0
        public static Arguments FromValue(Value value, bool returnNullIfNotExecutable = true)
        {
            value = value.Self;
            switch (value)
            {
            case OTuple tuple:
            {
                tuple.Values.Must().HaveLengthOf(2).OrThrow(LOCATION, () => "Tuple must have at least two values");
                var innerValue = tuple[0];
                if (tuple[1] is Lambda innerLambda)
                {
                    return(new Arguments(innerValue, innerLambda.Block, innerLambda.Parameters));
                }

                throw LOCATION.ThrowsWithLocation(() => "Second value must be a lambda");
            }

            case MessagePath chain:
            {
                var builder = new CodeBuilder();
                builder.Variable(State.DefaultParameterNames.ValueVariable);
                builder.Apply();
                builder.Value(chain);
                var block = builder.Block;
                return(new Arguments(new NullBlock(), block));
            }

            case Lambda lambda:
                return(new Arguments(new NullBlock(), lambda.Block, lambda.Parameters)
                {
                    Splatting = lambda.Splatting
                });

            case Block aBlock:
                return(new Arguments(new NullBlock(), aBlock, new NullParameters()));
            }

            if (returnNullIfNotExecutable)
            {
                return(null);
            }

            var argumentsBlock = PushValue(value);

            return(new Arguments(argumentsBlock));
        }