public static string GetFormattedSessionDescriptor(this SessionConfig.Experiment experimentPart) { var sessionName = experimentPart.SessionDescriptor; dynamic expandoContext = new ExpandoObject(); if (experimentPart.Params.Params != null && App.Instance.Registries.Registry <PluginExperiment>().LookUp(experimentPart.Params.Id, out var exp)) { var context = exp.DeserializeParams(experimentPart.Params.Params); foreach (var group in exp.Factory.ParameterGroups) { foreach (var parameter in @group.Parameters) { ((IDictionary <string, object>)expandoContext)[parameter.Key] = context.TryGet(parameter, out var val) ? val : parameter.DefaultValue; } } } var stringBuilder = new StringBuilder(); var offset = 0; void OffsetTo(int newOffset, bool write) { if (newOffset <= offset) { return; } if (write) { stringBuilder.Append(sessionName.Substring(offset, newOffset - offset)); } offset = newOffset; } while (true) { var open = sessionName.IndexOf("{{", offset, StringComparison.Ordinal); if (open == -1) { break; } OffsetTo(open, true); var close = sessionName.IndexOf("}}", open + 2, StringComparison.Ordinal); if (close == -1) { OffsetTo(open + 2, true); continue; } OffsetTo(close + 2, false); var script = sessionName.Substring(open + 2, close - open - 2); try { stringBuilder.Append(DslExpressionFactory.Create(script).Evaluate((IDictionary <string, object>)expandoContext)); } catch (Exception e) { Logger.Warn("GetFormattedSessionDescriptor", e, "sessionName", sessionName, "script", script); throw new UserException($"Failed to evaluate script: '{script}', session name: '{sessionName}'", e); } } OffsetTo(sessionName.Length, true); return(stringBuilder.ToString()); }
public static string GetFullSessionName(this SessionConfig.Experiment experimentPart, long?time = null) => Session.GetFullSessionName(time, experimentPart.Subject, GetFormattedSessionDescriptor(experimentPart));