private void writeObject(TextWriter writer, TinyObject obj, TinyToken parent, int indentLevel) { var parentIsArray = parent != null && parent.Type == TinyTokenType.Array; var first = true; foreach (var property in obj) { if (!first || !parentIsArray) { writeIndent(writer, indentLevel); } var key = property.Key; if (key.Contains(" ") || key.Contains(":") || key.StartsWith("-")) { key = "\"" + YamlUtil.EscapeString(key) + "\""; } var value = property.Value; if (value.IsEmpty) { writer.WriteLine(key + ":"); } else if (value.IsInline) { writer.Write(key + ": "); write(writer, value, obj, 0); } else { writer.WriteLine(key + ":"); write(writer, value, obj, indentLevel + 1); } first = false; } }
private void writeValue(TextWriter writer, TinyValue valueToken, TinyToken parent, int indentLevel) { if (indentLevel != 0) { throw new InvalidOperationException(); } var type = valueToken.Type; var value = valueToken.Value <object>(); switch (type) { case TinyTokenType.Null: writer.WriteLine(); break; case TinyTokenType.String: writer.WriteLine("\"" + YamlUtil.EscapeString((string)value) + "\""); break; case TinyTokenType.Integer: writer.WriteLine(value?.ToString()); break; case TinyTokenType.Float: if (value is float floatFloat) { writer.WriteLine(floatFloat.ToString(CultureInfo.InvariantCulture)); } else if (value is double floatDouble) { writer.WriteLine(floatDouble.ToString(CultureInfo.InvariantCulture)); } else if (value is decimal floatDecimal) { writer.WriteLine(floatDecimal.ToString(CultureInfo.InvariantCulture)); } else if (value is string floatString) { writer.WriteLine(floatString); } else { throw new InvalidDataException(value?.ToString()); } break; case TinyTokenType.Boolean: writer.WriteLine(((bool)value) ? BooleanTrue : BooleanFalse); break; case TinyTokenType.Array: case TinyTokenType.Object: case TinyTokenType.Invalid: // Should never happen :) throw new InvalidDataException(type.ToString()); default: throw new NotImplementedException(type.ToString()); } }