public static bool TryParse(
            IEnumerable <string> arrayBufferNames, string line,
            out SerializeArrayElementArgument arg)
        {
            int openBracket  = line.IndexOf('[');
            int closeBracket = line.LastIndexOf(']');

            if (openBracket == -1 && closeBracket == -1)
            {
                arg = null;
                return(false);
            }


            if (openBracket == -1 || closeBracket == -1)
            {
                throw new InvalidOperationException("Wrong use of array Accessor: " + line);
            }

            string name;
            string index;

            if (arrayBufferNames.Contains(name = line.Remove(openBracket, closeBracket - openBracket + 1)))
            {
                index = line.Substring(openBracket + 1, closeBracket - openBracket - 1);
                if (int.TryParse(
                        index,
                        out int id
                        ))
                {
                    arg = new SerializeArrayElementArgumentValueIndex(name, id);
                    return(true);
                }

                if (TryParse(arrayBufferNames, index, out SerializeArrayElementArgument innerArgument))
                {
                    arg = new SerializeArrayElementArgumentEnclosedIndex(name, innerArgument);

                    //Allows setting variables as index.
                    return(true);
                }

                arg = new SerializeArrayElementArgumentVariableIndex(name, index);
                return(true);
            }

            throw new InvalidOperationException("Wrong use of array Accessor: " + line);
        }
 public SerializeArrayElementArgumentEnclosedIndex(string value, SerializeArrayElementArgument index)
 {
     Index = index;
     Value = value;
 }