internal void WriteTo(XElement xe, TextWriter writer) { switch (XUtils.GetTypeAttr(xe)) { case "object": if (this.version >= TomlVersion.V04 && XUtils.GetTomlAttr(xe) == TomlItemType.InlineTable) { throw new SerializationException("Invalid 'type' attribute."); } this.SerializeObject(xe, writer); break; case "array": if (IsArrayOfTable(xe)) { this.SerializeArrayOfTable(xe, writer); } else { this.SerializeArray(xe, writer); } break; default: throw new SerializationException("Invalid 'type' attribute."); } }
private void SerializeArray(XElement xe, TextWriter writer) { writer.Write('['); foreach (var n in xe.Nodes()) { var e = n as XElement; if (e != null) { switch (XUtils.GetTypeAttr(e)) { case "string": WriteString(e, writer); break; case "number": WriteNumber(e, writer); break; case "boolean": WriteBoolean(e, writer); break; case "object": if (this.version >= TomlVersion.V04) { WriteInlineTable(e, writer); break; } throw new SerializationException("An array cannot contain tables."); case "array": SerializeArray(e, writer); break; default: // ignore null continue; } if (ExistsNextArrayItem(n)) { writer.Write(", "); } } else { var c = n as XComment; if (c != null) { WriteComment(c, writer); } else { throw new SerializationException("Unknown XNode."); } } } writer.Write(']'); }
private static object ToXml(TomlItemType nodeType, object obj) { var dt = obj as DynamicToml; if (dt != null) { return(dt.element.Elements()); } switch (nodeType) { case TomlItemType.Array: return(((IEnumerable)obj).Cast <object>().Select(o => { var type = GetTomlType(o); return new XElement("item", CreateTypeAttr(type), ToXml(type, o)); })); case TomlItemType.Table: case TomlItemType.InlineTable: var xd = new XDocument(); using (var xw = xd.CreateWriter()) { var s = new DataContractJsonSerializer(obj.GetType()); s.WriteObject(xw, obj); } var root = new XElement(xd.Root); foreach (var xe in root.Descendants()) { var type = XUtils.GetTypeAttr(xe); if (type == "null") { xe.Remove(); } else { xe.SetAttributeValue("toml", (type == "string" ? TomlItemType.BasicString : type == "number" ? (xe.Value.Any(c => c == '.' || c == 'e' || c == 'E') ? TomlItemType.Float : TomlItemType.Integer) : type == "boolean" ? TomlItemType.Boolean : type == "array" ? TomlItemType.Array : TomlItemType.Table).ToString() ); } } return(root.Elements()); default: return(obj); } }
private static bool ExistsNextArrayItem(XNode xn) { while (xn.NextNode != null) { xn = xn.NextNode; var xe = xn as XElement; if (xe != null && XUtils.GetTypeAttr(xe) != "null") { return(true); } } return(false); }
private void WriteInlineTable(XElement xe, TextWriter writer) { writer.Write('{'); foreach (var n in xe.Nodes()) { var e = n as XElement; if (e != null) { WriteKey(e, writer); switch (XUtils.GetTypeAttr(e)) { case "string": WriteString(e, writer); break; case "number": WriteNumber(e, writer); break; case "boolean": WriteBoolean(e, writer); break; case "object": WriteInlineTable(e, writer); break; case "array": SerializeArray(e, writer); break; default: // ignore null continue; } if (ExistsNextArrayItem(n)) { writer.Write(", "); } } else { if (n is XComment) { throw new SerializationException("A comment is not allowed in an inline table."); } throw new SerializationException("Unknown XNode."); } } writer.Write('}'); }
private string GetFullName(XElement xe) { var s = new Stack <string>(); while (xe.Parent != null) { if (XUtils.GetTypeAttr(xe.Parent) != "array") { var key = XUtils.GetKey(xe); if (this.version >= TomlVersion.V04 && !IsValidBareKey(key)) { key = CreateBasicString(key); } s.Push(XUtils.GetKey(xe)); } xe = xe.Parent; } return(string.Join(".", s)); }
private static bool IsArrayOfTable(XElement xe) { return(xe.HasElements && XUtils.GetTypeAttr(xe.Elements().First()) == "object"); }
private void SerializeObject(XElement xe, TextWriter writer) { // Table と Array of Table は後に var ordered = xe.Nodes().OrderBy(n => { var e = n as XElement; if (e != null) { var type = XUtils.GetTypeAttr(e); if (type == "object") { return(true); } if (type == "array" && IsArrayOfTable(e)) { return(true); } } return(false); }); foreach (var n in ordered) { var e = n as XElement; if (e != null) { switch (XUtils.GetTypeAttr(e)) { case "string": WriteKey(e, writer); WriteString(e, writer); writer.WriteLine(); break; case "number": WriteKey(e, writer); WriteNumber(e, writer); writer.WriteLine(); break; case "boolean": WriteKey(e, writer); WriteBoolean(e, writer); writer.WriteLine(); break; case "object": if (this.version >= TomlVersion.V04 && XUtils.GetTomlAttr(e) == TomlItemType.InlineTable) { WriteKey(e, writer); WriteInlineTable(e, writer); writer.WriteLine(); } else { writer.WriteLine("[{0}]", GetFullName(e)); SerializeObject(e, writer); } break; case "array": if (IsArrayOfTable(e)) { SerializeArrayOfTable(e, writer); } else { WriteKey(e, writer); SerializeArray(e, writer); writer.WriteLine(); break; } break; default: // ignore null break; } } else { var c = n as XComment; if (c != null) { WriteComment(c, writer); } else { throw new SerializationException("Unknown XNode."); } } } }