internal static Tuple<string, string[], string> ParseSections(string value)
{
string versionString = null;
string[] releaseLabels = null;
string buildMetadata = null;
var dashPos = -1;
var plusPos = -1;
var chars = value.ToCharArray();
var end = false;
for (var i = 0; i < chars.Length; i++)
{
end = (i == chars.Length - 1);
if (dashPos < 0)
{
if (end
|| chars[i] == '-'
|| chars[i] == '+')
{
var endPos = i + (end ? 1 : 0);
versionString = value.Substring(0, endPos);
dashPos = i;
if (chars[i] == '+')
{
plusPos = i;
}
}
}
else if (plusPos < 0)
{
if (end || chars[i] == '+')
{
var start = dashPos + 1;
var endPos = i + (end ? 1 : 0);
var releaseLabel = value.Substring(start, endPos - start);
releaseLabels = releaseLabel.Split('.');
plusPos = i;
}
}
else if (end)
{
var start = plusPos + 1;
var endPos = i + (end ? 1 : 0);
buildMetadata = value.Substring(start, endPos - start);
}
}
return new Tuple<string, string[], string>(versionString, releaseLabels, buildMetadata);
}