diff --git a/src/Discord.Net/ETF/ETFReader.cs b/src/Discord.Net/ETF/ETFReader.cs index 051337f86..9cbbbfa74 100644 --- a/src/Discord.Net/ETF/ETFReader.cs +++ b/src/Discord.Net/ETF/ETFReader.cs @@ -29,36 +29,8 @@ namespace Discord.ETF _buffer = new byte[11]; _encoding = Encoding.UTF8; } - - private bool ReadNil(bool ignoreLength = false) - { - if (!ignoreLength) - { - _stream.Read(_buffer, 0, 1); - byte length = _buffer[0]; - if (length != 3) return false; - } - - _stream.Read(_buffer, 0, 3); - if (_buffer[0] == 'n' && _buffer[1] == 'i' && _buffer[2] == 'l') - return true; - - return false; - } - private void ReadTrue() - { - _stream.Read(_buffer, 0, 4); - if (_buffer[0] != 't' || _buffer[1] != 'r' || _buffer[2] != 'u' || _buffer[3] != 'e') - throw new InvalidDataException(); - } - private void ReadFalse() - { - _stream.Read(_buffer, 0, 5); - if (_buffer[0] != 'f' || _buffer[1] != 'a' || _buffer[2] != 'l' || _buffer[3] != 's' || _buffer[4] != 'e') - throw new InvalidDataException(); - } - - public bool? ReadNullableBool() + + public bool ReadBool() { _stream.Read(_buffer, 0, 1); ETFType type = (ETFType)_buffer[0]; @@ -67,10 +39,6 @@ namespace Discord.ETF _stream.Read(_buffer, 0, 1); switch (_buffer[0]) //Length { - case 3: - if (ReadNil()) - return null; - break; case 4: ReadTrue(); return true; @@ -81,24 +49,17 @@ namespace Discord.ETF } throw new InvalidDataException(); } - public bool ReadBool() + private void ReadTrue() { - _stream.Read(_buffer, 0, 1); - ETFType type = (ETFType)_buffer[0]; - if (type == ETFType.SMALL_ATOM_EXT) - { - _stream.Read(_buffer, 0, 1); - switch (_buffer[0]) //Length - { - case 4: - ReadTrue(); - return true; - case 5: - ReadFalse(); - return false; - } - } - throw new InvalidDataException(); + _stream.Read(_buffer, 0, 4); + if (_buffer[0] != 't' || _buffer[1] != 'r' || _buffer[2] != 'u' || _buffer[3] != 'e') + throw new InvalidDataException(); + } + private void ReadFalse() + { + _stream.Read(_buffer, 0, 5); + if (_buffer[0] != 'f' || _buffer[1] != 'a' || _buffer[2] != 'l' || _buffer[3] != 's' || _buffer[4] != 'e') + throw new InvalidDataException(); } public int ReadSByte() @@ -194,6 +155,29 @@ namespace Discord.ETF throw new NotImplementedException(); } + public bool? ReadNullableBool() + { + _stream.Read(_buffer, 0, 1); + ETFType type = (ETFType)_buffer[0]; + if (type == ETFType.SMALL_ATOM_EXT) + { + _stream.Read(_buffer, 0, 1); + switch (_buffer[0]) //Length + { + case 3: + if (ReadNil()) + return null; + break; + case 4: + ReadTrue(); + return true; + case 5: + ReadFalse(); + return false; + } + } + throw new InvalidDataException(); + } public int? ReadNullableSByte() { _stream.Read(_buffer, 0, 1); @@ -274,6 +258,48 @@ namespace Discord.ETF throw new NotImplementedException(); } + public T Read() + where T : new() + { + var type = typeof(T); + var typeInfo = type.GetTypeInfo(); + var action = _deserializers.GetOrAdd(type, _ => CreateDeserializer(type, typeInfo)) as Func; + return action(this); + } + /*public void Read() + where T : Nullable + where U : struct, new() + { + }*/ + public T[] ReadArray() + { + throw new NotImplementedException(); + } + public IDictionary ReadDictionary() + { + throw new NotImplementedException(); + } + /*public object Read(object obj) + { + throw new NotImplementedException(); + }*/ + + private bool ReadNil(bool ignoreLength = false) + { + if (!ignoreLength) + { + _stream.Read(_buffer, 0, 1); + byte length = _buffer[0]; + if (length != 3) return false; + } + + _stream.Read(_buffer, 0, 3); + if (_buffer[0] == 'n' && _buffer[1] == 'i' && _buffer[2] == 'l') + return true; + + return false; + } + #region Emit private static Func CreateDeserializer(Type type, TypeInfo typeInfo) where T : new()