/// <summary> /// Evaluates a join intrinsic. /// </summary> /// <param name="joinIntrinsic">The join intrinsic.</param> /// <returns>Evaluation of the join.</returns> private static object EvaluateJoin(JoinIntrinsic joinIntrinsic) { var elements = new List <string>(); foreach (var item in joinIntrinsic.Items) { if (item is IIntrinsic intrinsic) { var nested = intrinsic.GetInfo(); var evaluation = nested.Intrinsic.Evaluate(nested); if (evaluation.IsScalar()) { elements.Add(evaluation.ToString()); } else { elements.AddRange(from object listItem in evaluation as IEnumerable select listItem.ToString()); } } else { elements.Add(item.ToString()); } } return(string.Join(joinIntrinsic.Separator, elements)); }
/// <summary> /// Renders the join function arguments as a list that can be passed to the base class constructor. /// </summary> /// <param name="joinIntrinsic">The join intrinsic.</param> /// <param name="template">The template.</param> /// <param name="inputs">The inputs.</param> /// <returns>List of join arguments, with intrinsic functions rendered.</returns> private static IEnumerable <object> FunctionArguments( JoinIntrinsic joinIntrinsic, ITemplate template, IList <InputVariable> inputs) { // Build up a join() function reference var joinArguments = new List <object> { joinIntrinsic.Separator }; var joinList = new List <object>(); foreach (var item in joinIntrinsic.Items) { switch (item) { case IIntrinsic nestedIntrinsic: joinList.Add( nestedIntrinsic.Render(template, nestedIntrinsic.GetInfo().TargetResource, inputs).ToJConstructor()); break; default: // join() is a string function - all args are therefore string joinList.Add(item.ToString()); break; } } joinArguments.Add(joinList); return(joinArguments); }
/// <summary> /// Renders the specified join intrinsic. /// </summary> /// <param name="joinIntrinsic">The join intrinsic.</param> /// <param name="template">The template.</param> /// <param name="resource">The resource.</param> /// <param name="inputs">The list of input variables and data sources.</param> /// <returns>A <see cref="FunctionReference"/> to an HCL join() expression.</returns> private static Reference Render( JoinIntrinsic joinIntrinsic, ITemplate template, ResourceMapping resource, IList <InputVariable> inputs) { return(new JoinFunctionReference(joinIntrinsic, template, inputs)); }
/// <summary> /// Initializes a new instance of the <see cref="JoinFunctionReference"/> class. /// </summary> /// <param name="joinIntrinsic">The join intrinsic.</param> /// <param name="template">The template.</param> /// <param name="inputs">The inputs.</param> public JoinFunctionReference(JoinIntrinsic joinIntrinsic, ITemplate template, IList <InputVariable> inputs) : this("join", FunctionArguments(joinIntrinsic, template, inputs)) { }