private MvxSerializableBindingDescription ParseBindingDescription() { var description = new MvxSerializableBindingDescription(); description.Mode = ReadOptionalBindingMode(); SkipWhitespace(); description.Path = ReadSourcePath(); SkipWhitespace(); if (IsComplete) return description; var currentChar = CurrentChar; char closingBrace; switch (currentChar) { case '(': closingBrace = ')'; break; case '[': closingBrace = ']'; break; case '{': closingBrace = ')'; break; default: return description; } MoveNext(); while (true) { SkipWhitespace(); if (IsComplete) { throw new MvxException("Unterminated options seen in binding {0}", FullText); } if (CurrentChar == closingBrace) { MoveNext(); return description; } ParseOptionalBindingField(description); SkipWhitespaceAndDescriptionSeparators(); } }
public bool TryParseBindingDescription(string text, out MvxSerializableBindingDescription requestedDescription) { try { Reset(text); requestedDescription = this.ParseBindingDescription(); return true; } catch (Exception exception) { MvxBindingTrace.Trace(MvxTraceLevel.Error, "Problem parsing Swiss binding {0}", exception.ToLongString()); requestedDescription = null; return false; } }
private void ParseNextBindingDescriptionOptionInto(MvxSerializableBindingDescription description) { if (IsComplete) return; var block = ReadTextUntilNonQuotedOccurrenceOfAnyOf('=', ',', ';'); block = block.Trim(); if (string.IsNullOrEmpty(block)) { return; } switch (block) { case "Path": ParseEquals(block); description.Path = ReadTextUntilNonQuotedOccurrenceOfAnyOf(',', ';'); break; case "Converter": ParseEquals(block); description.Converter = ReadTextUntilNonQuotedOccurrenceOfAnyOf(',', ';'); break; case "ConverterParameter": ParseEquals(block); description.ConverterParameter = ReadValue(); break; case "FallbackValue": ParseEquals(block); description.FallbackValue = ReadValue(); break; case "Mode": ParseEquals(block); //if (description.Mode != MvxBindingMode.Default) //{ // MvxBindingTrace.Trace(MvxTraceLevel.Warning, "Mode specified multiple times in binding in {0} - for readability either use <,>,<1,<> or use (Mode=...) - not both", FullText); //} description.Mode = ReadBindingMode(); break; default: if (!string.IsNullOrEmpty(description.Path)) { throw new MvxException("You cannot specify Path more than once - first Path '{0}', second Path '{1}', position {2} in {3}", description.Path, block, CurrentIndex, FullText); } description.Path = block; break; } }
public bool TryParseBindingDescription(string text, out MvxSerializableBindingDescription requestedDescription) { if (string.IsNullOrEmpty(text)) { requestedDescription = new MvxSerializableBindingDescription(); return false; } try { var converter = this.GetService<IMvxJsonConverter>(); requestedDescription = converter.DeserializeObject<MvxSerializableBindingDescription>(text); } catch (Exception exception) { requestedDescription = null; MvxBindingTrace.Trace(MvxTraceLevel.Error, "Problem parsing Json tag for databinding {0}", exception.ToLongString()); return false; } return true; }
private void AssertAreEquivalent(MvxSerializableBindingDescription expected, MvxSerializableBindingDescription actual) { Assert.AreEqual(expected.Converter, actual.Converter); Assert.AreEqual(expected.ConverterParameter, actual.ConverterParameter); Assert.AreEqual(expected.FallbackValue, actual.FallbackValue); Assert.AreEqual(expected.Mode, actual.Mode); Assert.AreEqual(expected.Path, actual.Path); }
private MvxSerializableBindingDescription ParseBindingDescription() { var description = new MvxSerializableBindingDescription(); SkipWhitespace(); while (true) { ParseNextBindingDescriptionOptionInto(description); SkipWhitespace(); if (IsComplete) return description; switch (CurrentChar) { case ',': MoveNext(); break; case ';': return description; default: throw new MvxException("Unexpected character {0} at position {1} in {2} - expected string-end, ',' or ';'", CurrentChar, CurrentIndex, FullText); } } }
public bool TryParseBindingDescription(string text, out MvxSerializableBindingDescription requestedDescription) { return ChooseParser(text).TryParseBindingDescription(text, out requestedDescription); }
protected void ParseOptionalBindingField(MvxSerializableBindingDescription description) { var optionName = ReadValidCSharpName(); SkipWhitespace(); if(IsComplete) throw new MvxException("Invalid termination of binding while reading optional binding property in {0}", FullText); if (CurrentChar != '=') throw new MvxException("Missing = in binding - character seen is {0} in {1}", CurrentChar, FullText); MoveNext(); switch (optionName) { case "Converter": var converterName = ReadValidCSharpName(); description.Converter = converterName; break; case "ConverterParameter": var converterParameter = ReadValue(); description.ConverterParameter = converterParameter; break; case "FallbackValue": case "DefaultValue": var fallbackValue = ReadValue(); description.FallbackValue = fallbackValue; break; case "Mode": if (description.Mode != MvxBindingMode.Default) { MvxBindingTrace.Trace(MvxTraceLevel.Warning, "Mode specified multiple times in binding in {0} - for readability either use <,>,<1,<> or use (Mode=...) - not both", FullText); } description.Mode = ReadBindingMode(); break; default: throw new MvxException("Unknown binding option {0} in {1}", optionName, FullText); } }