public static bool TryParse(string input, out WarningHeaderValue parsedValue) { var lexer = new Lexer(input); Token token; if (TryParseElement(lexer, out parsedValue, out token) && token == Token.Type.End) { return(true); } parsedValue = null; return(false); }
static bool TryParseElement(Lexer lexer, out WarningHeaderValue parsedValue, out Token t) { parsedValue = null; t = lexer.Scan(); if (t != Token.Type.Token) { return(false); } int code; if (!lexer.TryGetNumericValue(t, out code) || !IsCodeValid(code)) { return(false); } t = lexer.Scan(); if (t != Token.Type.Token) { return(false); } var next = t; if (lexer.PeekChar() == ':') { lexer.EatChar(); next = lexer.Scan(); if (next != Token.Type.Token) { return(false); } } var value = new WarningHeaderValue(); value.Code = code; value.Agent = lexer.GetStringValue(t, next); t = lexer.Scan(); if (t != Token.Type.QuotedString) { return(false); } value.Text = lexer.GetStringValue(t); t = lexer.Scan(); if (t == Token.Type.QuotedString) { DateTimeOffset date; if (!lexer.TryGetDateValue(t, out date)) { return(false); } value.Date = date; t = lexer.Scan(); } parsedValue = value; return(true); }