public static bool TryParse (string input, out ContentRangeHeaderValue parsedValue)
{
parsedValue = null;
var lexer = new Lexer (input);
var t = lexer.Scan ();
if (t != Token.Type.Token)
return false;
var value = new ContentRangeHeaderValue ();
value.unit = lexer.GetStringValue (t);
t = lexer.Scan ();
if (t != Token.Type.Token)
return false;
int nvalue;
if (!lexer.IsStarStringValue (t)) {
if (!lexer.TryGetNumericValue (t, out nvalue)) {
var s = lexer.GetStringValue (t);
if (s.Length < 3)
return false;
var sep = s.Split ('-');
if (sep.Length != 2)
return false;
if (!int.TryParse (sep[0], NumberStyles.None, CultureInfo.InvariantCulture, out nvalue))
return false;
value.From = nvalue;
if (!int.TryParse (sep[1], NumberStyles.None, CultureInfo.InvariantCulture, out nvalue))
return false;
value.To = nvalue;
} else {
value.From = nvalue;
t = lexer.Scan (recognizeDash: true);
if (t != Token.Type.SeparatorDash)
return false;
t = lexer.Scan ();
if (!lexer.TryGetNumericValue (t, out nvalue))
return false;
value.To = nvalue;
}
}
t = lexer.Scan ();
if (t != Token.Type.SeparatorSlash)
return false;
t = lexer.Scan ();
if (!lexer.IsStarStringValue (t)) {
long lvalue;
if (!lexer.TryGetNumericValue (t, out lvalue))
return false;
value.Length = lvalue;
}
t = lexer.Scan ();
if (t != Token.Type.End)
return false;
parsedValue = value;
return true;
}