public void Serialize(OMCLItem item) { switch (item.Type) { case OMCLItem.OMCLItemType.Object: Write(item.AsObject()); break; case OMCLItem.OMCLItemType.Array: Write(item.AsArray()); break; case OMCLItem.OMCLItemType.String: Write(item.AsString()); break; case OMCLItem.OMCLItemType.Bool: Write(item.AsBool()); break; case OMCLItem.OMCLItemType.Int: Write(item.AsInt()); break; case OMCLItem.OMCLItemType.Float: Write(item.AsFloat()); break; } _writer.Flush(); _writer.Close(); }
private object ConvertItemToValue(Type targetType, OMCLItem item) { var tags = item.Tags; var sourceType = item.Type; switch (sourceType) { case OMCLItem.OMCLItemType.None: return(ConvertNone(targetType, tags)); case OMCLItem.OMCLItemType.String: return(ConvertString(targetType, tags, item.AsString())); case OMCLItem.OMCLItemType.Int: return(Convert.ChangeType(item.AsInt(), targetType)); case OMCLItem.OMCLItemType.Bool: return(item.AsBool()); case OMCLItem.OMCLItemType.Float: return(Convert.ChangeType(item.AsFloat(), targetType)); case OMCLItem.OMCLItemType.Object: return(ConvertObject(targetType, tags, item.AsObject())); case OMCLItem.OMCLItemType.Array: return(ConvertArray(targetType, tags, item.AsArray())); default: throw new NotImplementedException(); } }
private OMCLItem DoParseObject(List <string> tags) { SkipNewlines(); if (!Expect(TokenType.OpenBrace)) { ReportError("Failed to parse object. Expected '{'"); } if (CheckToken(TokenType.ClosingBrace)) { NextToken(); return(new OMCLObject()); } var resultObject = DoParseObject(TokenType.ClosingBrace); if (!Expect(TokenType.ClosingBrace)) { ReportError("Failed to parse object. Expected '}}'"); } OMCLItem result = resultObject; result.Tags = tags; return(result); }
private OMCLItem DoParseArray(List <string> tags) { OMCLArray resultArray = new OMCLArray(); if (!Expect(TokenType.OpenBracket)) { ReportError("Failed to parse array. Expected '['"); } SkipNewlines(); var next = PeekToken(); while (true) { if (next.Type == TokenType.EOF) { ReportError("Unexpected end of file in array"); return(null); } if (next.Type == TokenType.ClosingBracket) { break; } var item = ParseItem(); resultArray.Add(item); bool nl = SkipNewlines(); next = PeekToken(); if (next.Type == TokenType.ClosingBracket) { break; } else if (next.Type == TokenType.Comma) { NextToken(); SkipNewlines(); next = PeekToken(); } else if (!nl) { ReportError("Failed to parse array. Expected '\\n' or ',' after value in array"); return(null); } } if (!Expect(TokenType.ClosingBracket)) { ReportError("Failed to parse array. Expected ']'"); return(null); } OMCLItem result = resultArray; result.Tags = tags; return(result); }
private void WriteValue(OMCLItem item) { var prev = _indentationLevel++; try { foreach (var t in item.Tags) { _writer.Write($"!{t} "); } switch (item.Type) { case OMCLItem.OMCLItemType.Object: Write(item.AsObject()); break; case OMCLItem.OMCLItemType.Array: Write(item.AsArray()); break; case OMCLItem.OMCLItemType.String: var str = item.AsString(); var parts = str.Split('"'); var escaped = string.Join("\" '\"' \"", parts); Write(escaped); break; case OMCLItem.OMCLItemType.Bool: Write(item.AsBool()); break; case OMCLItem.OMCLItemType.Int: Write(item.AsInt()); break; case OMCLItem.OMCLItemType.Float: Write(item.AsFloat()); break; case OMCLItem.OMCLItemType.None: Write(item.AsNone()); break; } } finally { _indentationLevel = prev; } }
private void SetField(MemberInfo info, object obj, OMCLItem item) { switch (info) { case PropertyInfo pi: { object val = ConvertItemToValue(pi.PropertyType, item); pi.SetValue(obj, val); break; } case FieldInfo fi: { object val = ConvertItemToValue(fi.FieldType, item); fi.SetValue(obj, val); break; } } }
public OMCLItem ParseItem() { var tags = ParseTags(); SkipNewlines(); var next = PeekToken(); switch (next.Type) { case TokenType.OpenBrace: return(DoParseObject(tags)); case TokenType.OpenBracket: return(DoParseArray(tags)); case TokenType.String: { NextToken(); var sb = new StringBuilder(); sb.Append(next.value as string); while (true) { next = PeekToken(); if (next.Type == TokenType.String) { sb.Append(next.value as string); NextToken(); } else { break; } } OMCLItem result = sb.ToString(); result.Tags = tags; return(result); } case TokenType.KwFalse: goto case TokenType.KwTrue; case TokenType.KwTrue: { NextToken(); OMCLItem result = next.Type == TokenType.KwTrue; result.Tags = tags; return(result); } case TokenType.KwNone: { NextToken(); OMCLItem result = new OMCLNone(); result.Tags = tags; return(result); } case TokenType.Int: { NextToken(); OMCLItem result = (long)next.value; result.Tags = tags; return(result); } case TokenType.Float: { NextToken(); OMCLItem result = (double)next.value; result.Tags = tags; return(result); } } throw new NotImplementedException(nameof(ParseItem)); }