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)); }
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)); }