public static ScriptLineView CreateOrError(int lineIndex, string lineText, IReadOnlyList <Token> tokens, VisualElement container, bool hideParameters) { errors.Clear(); var model = commandLineParser.Parse(lineText, tokens, errors)?.Command; if (model is null || errors.Count > 0) { return(Error(errors.FirstOrDefault())); } var meta = projectMeta.commands.FirstOrDefault(c => (c.id?.EqualsFastIgnoreCase(model.Identifier) ?? false) || (c.alias?.EqualsFastIgnoreCase(model.Identifier) ?? false)); if (meta is null) { return(Error($"Unknown command: `{model.Identifier}`")); } var nameLabel = new Label(model.Identifier.Text.FirstToLower()); nameLabel.name = "InputLabel"; nameLabel.AddToClassList("Inlined"); var commandLineView = new CommandLineView(lineIndex, container); commandLineView.Content.Add(nameLabel); commandLineView.CommandId = model.Identifier; commandLineView.hideParameters = hideParameters; foreach (var paramMeta in meta.@params) { var data = new ParameterFieldData { Id = string.IsNullOrEmpty(paramMeta.alias) ? paramMeta.id.FirstToLower() : paramMeta.alias, Value = GetValueFor(paramMeta), Nameless = paramMeta.nameless }; if (commandLineView.ShouldShowParameter(data)) { commandLineView.AddParameterField(data); } else { commandLineView.delayedAddFields.Add(data); } } return(commandLineView); ErrorLineView Error(string e) => new ErrorLineView(lineIndex, lineText, container, model?.Identifier, e); string GetValueFor(ProjectMetadata.ParameterMetadata m) { var param = model.Parameters.FirstOrDefault(p => p.Identifier.Text.EqualsFastIgnoreCase(m.id) || p.Identifier.Text.EqualsFastIgnoreCase(m.alias)); return(param?.Value); } }
public static ScriptLineView CreateOrError(int lineIndex, string lineText, VisualElement container, bool hideParameters) { var commandBodyText = lineText.GetAfterFirst(CommandScriptLine.IdentifierLiteral); var commandId = commandBodyText.GetBefore(" ") ?? commandBodyText.GetBefore("\t") ?? commandBodyText.Trim(); var commandType = Command.ResolveCommandType(commandId); if (commandType is null) { return(Error("Failed to resolve command type.")); } var commandLineView = new CommandLineView(lineIndex, container); var nameLabel = new Label(commandId); nameLabel.name = "InputLabel"; nameLabel.AddToClassList("Inlined"); commandLineView.Content.Add(nameLabel); commandLineView.CommandId = commandId; commandLineView.hideParameters = hideParameters; var paramFields = commandType.GetFields(BindingFlags.Public | BindingFlags.Instance) .Where(f => typeof(ICommandParameter).IsAssignableFrom(f.FieldType)); var paramValues = typeof(Command).GetMethod("ExtractParameters", BindingFlags.Static | BindingFlags.NonPublic) .Invoke(null, new[] { commandBodyText, string.Empty }) as LiteralMap <string>; foreach (var paramField in paramFields) { var paramAlias = paramField.GetCustomAttribute <Command.ParameterAliasAttribute>()?.Alias; var paramId = paramAlias ?? char.ToLowerInvariant(paramField.Name[0]) + paramField.Name.Substring(1); var nameless = string.IsNullOrEmpty(paramId); paramValues.TryGetValue(paramId, out var valueText); if (valueText is null) { paramValues.TryGetValue(paramField.Name, out valueText); } var data = new ParameterFieldData { Id = paramId, Name = paramField.Name, Value = valueText, Nameless = nameless }; if (!data.Nameless && hideParameters && string.IsNullOrEmpty(data.Value)) { commandLineView.delayedAddFields.Add(data); // Add un-assigned fields on hover for better init performance. } else { commandLineView.AddParameterField(data); } } return(commandLineView); ErrorLineView Error(string error) => new ErrorLineView(lineIndex, lineText, container, commandId, error); }