protected IResult <Unit> serializeObject(string name, object obj) { builder.BeginObject(name.ToLower1()); var members = serializeMembers(obj); if (members.IsSuccessful) { builder.End(); } return(members); }
protected IResult <Unit> parseMembers(string name) { while (index < source.Length) { var token = lookAhead(); if (token.ValueOrCast <Unit>(out var type, out var asUnit)) { switch (type) { case TokenType.Comma: setLookAheadTokenToNone(); invokeEvent(TokenType.Comma, name, ","); break; case TokenType.ObjectClose: setLookAheadTokenToNone(); invokeEvent(TokenType.ObjectClose, name, "}"); builder.End(); return(Unit.Success()); default: var result = from innerName in parseNameOrString() from next in nextToken() from colon in next.Must().Equal(TokenType.Colon).OrFailure(() => $"Expected colon at {index}: {source.Drop(index)}").Map(t => next) from value in parseValue(innerName) select value; if (result.ValueOrOriginal(out _, out var original)) { break; } else { return(original); } } }