protected NameValueWithParametersHeaderValue(NameValueWithParametersHeaderValue source)
     : base(source)
 {
     if (source.parameters != null)
     {
         foreach (var item in source.parameters)
         {
             Parameters.Add(item);
         }
     }
 }
        public static bool TryParse(string input, out NameValueWithParametersHeaderValue 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 NameValueWithParametersHeaderValue parsedValue, out Token t)
        {
            parsedValue = null;

            t = lexer.Scan();
            if (t != Token.Type.Token)
            {
                return(false);
            }

            parsedValue = new NameValueWithParametersHeaderValue()
            {
                Name = lexer.GetStringValue(t),
            };

            t = lexer.Scan();
            if (t == Token.Type.SeparatorEqual)
            {
                t = lexer.Scan();

                if (t == Token.Type.Token || t == Token.Type.QuotedString)
                {
                    parsedValue.value = lexer.GetStringValue(t);
                    t = lexer.Scan();
                }
                else
                {
                    return(false);
                }
            }

            if (t == Token.Type.SeparatorSemicolon)
            {
                List <NameValueHeaderValue> result;
                if (!TryParseParameters(lexer, out result, out t))
                {
                    return(false);
                }

                parsedValue.parameters = result;
            }

            return(true);
        }