Code/Dependencies/Pixie/Pixie/Options/GnuOptionPrinter.cs
using System.Collections.Generic;
using WasmBox.Pixie.Markup;

namespace WasmBox.Pixie.Options {
    /// <summary>
    /// An option printer for GNU-style options.
    /// </summary>
    public sealed class GnuOptionPrinter : OptionPrinter {
        private GnuOptionPrinter() { }

        /// <summary>
        /// Gets an instance of a GNU-style option printer.
        /// </summary>
        /// <returns>An option printer.</returns>
        public static readonly GnuOptionPrinter Instance =
            new GnuOptionPrinter();

        /// <inheritdoc/>
        public override MarkupNode Print(
            OptionForm form,
            IReadOnlyList<OptionParameter> parameters) {
            int paramCount = parameters.Count;
            if (paramCount == 1) {
                var symbolicParam = parameters[0] as SymbolicOptionParameter;
                if (!symbolicParam.IsVarargs) {
                    if (form.IsShort && form.Name.Length == 1) {
                        // Concatenated syntax. Example: -g<n>
                        return new Sequence(
                            form.ToString(),
                            parameters[0].Representation);
                    }
                    else {
                        // Equals-sign syntax. Example: -ferror-limit=<n>
                        return new Sequence(
                            form.ToString() + "=",
                            parameters[0].Representation);
                    }
                }
            }

            // General syntax. Example: -x language files...
            var nodes = new List<MarkupNode>();
            nodes.Add(form.ToString());
            for (int i = 0; i < paramCount; i++) {
                nodes.Add(" ");
                nodes.Add(parameters[i].Representation);
            }

            return new Sequence(nodes);
        }
    }
}