| @@ -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<T>() | |||
| where T : new() | |||
| { | |||
| var type = typeof(T); | |||
| var typeInfo = type.GetTypeInfo(); | |||
| var action = _deserializers.GetOrAdd(type, _ => CreateDeserializer<T>(type, typeInfo)) as Func<ETFReader, T>; | |||
| return action(this); | |||
| } | |||
| /*public void Read<T, U>() | |||
| where T : Nullable<T> | |||
| where U : struct, new() | |||
| { | |||
| }*/ | |||
| public T[] ReadArray<T>() | |||
| { | |||
| throw new NotImplementedException(); | |||
| } | |||
| public IDictionary<TKey, TValue> ReadDictionary<TKey, TValue>() | |||
| { | |||
| 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<ETFReader, T> CreateDeserializer<T>(Type type, TypeInfo typeInfo) | |||
| where T : new() | |||