public static IHerculesTagsBuilder AddTags(this IHerculesTagsBuilder builder, HerculesTags tags) { foreach (var tag in tags) { var key = tag.Key; var value = tag.Value; switch (value.Type) { case HerculesValueType.String: builder.AddValue(key, value.AsString); break; case HerculesValueType.Long: builder.AddValue(key, value.AsLong); break; case HerculesValueType.Guid: builder.AddValue(key, value.AsGuid); break; case HerculesValueType.Container: builder.AddContainer(key, tagsBuilder => tagsBuilder.AddTags(value.AsContainer)); break; case HerculesValueType.Int: builder.AddValue(key, value.AsInt); break; case HerculesValueType.Double: builder.AddValue(key, value.AsDouble); break; case HerculesValueType.Bool: builder.AddValue(key, value.AsBool); break; case HerculesValueType.Null: builder.AddNull(key); break; case HerculesValueType.Byte: builder.AddValue(key, value.AsByte); break; case HerculesValueType.Short: builder.AddValue(key, value.AsShort); break; case HerculesValueType.Float: builder.AddValue(key, value.AsFloat); break; case HerculesValueType.Vector: builder.AddVector(key, value.AsVector); break; default: throw new ArgumentOutOfRangeException(nameof(value.Type), value.Type, "Unknown tag type."); } } return(builder); }
private static void ReadContainer(IBinaryReader reader, IHerculesTagsBuilder builder) { var tagsCount = reader.ReadInt16(); for (var i = 0; i < tagsCount; i++) { var key = reader.ReadShortString(); var valueType = (TagType)reader.ReadByte(); switch (valueType) { case TagType.String: builder.AddValue(key, reader.ReadString()); break; case TagType.Long: builder.AddValue(key, reader.ReadInt64()); break; case TagType.Uuid: builder.AddValue(key, reader.ReadGuid()); break; case TagType.Container: builder.AddContainer(key, b => ReadContainer(reader, b)); break; case TagType.Integer: builder.AddValue(key, reader.ReadInt32()); break; case TagType.Double: builder.AddValue(key, reader.ReadDouble()); break; case TagType.Flag: builder.AddValue(key, reader.ReadBool()); break; case TagType.Null: builder.AddNull(key); break; case TagType.Byte: builder.AddValue(key, reader.ReadByte()); break; case TagType.Short: builder.AddValue(key, reader.ReadInt16()); break; case TagType.Float: builder.AddValue(key, reader.ReadFloat()); break; case TagType.Vector: ReadVector(reader, builder, key); break; default: throw new ArgumentOutOfRangeException(nameof(valueType), valueType, "Unexpected tag value type."); } } }