public static string[] ToArray(this string data)
{
var results = new List<string>();
if (data != string.Empty)
{
var stateStack = new Stack<ArrayProcessState>();
var currentState = ArrayProcessState.parsingText;
var currentString = string.Empty;
if (data[0] != '[' || data[data.Length - 1] != ']')
{
throw new Exception("Array is not contained in braces.");
}
foreach (var c in data.RemoveBraces()) //TODO Throw an exception if not surrounded by '[]'
{
switch (currentState)
{
case ArrayProcessState.parsingText:
switch (c)
{
case '{':
stateStack.Push(currentState);
currentState = ArrayProcessState.parsingObject;
currentString += c;
break;
case ',':
results.Add(currentString);
currentString = string.Empty;
break;
default:
currentString += c;
break;
}
break;
case ArrayProcessState.parsingObject:
switch (c)
{
case '{':
stateStack.Push(currentState);
currentState = ArrayProcessState.parsingObject;
currentString += c;
break;
case '}':
currentState = stateStack.Pop();
currentString += c;
break;
default:
currentString += c;
break;
}
break;
}
}
if (currentString.Trim() != string.Empty)
{
results.Add(currentString);
}
}
return results.ToArray();
}