public override DateTime Read(ref CborReader reader) { switch (reader.GetCurrentDataItemType()) { case CborDataItemType.String: ReadOnlySpan <byte> rawString = reader.ReadRawString(); if (!TryRead(rawString, out DateTime dateTime)) { throw reader.BuildException($"Invalid date format {Encoding.UTF8.GetString(rawString)}"); } return(dateTime); case CborDataItemType.Signed: case CborDataItemType.Unsigned: long unixTime = reader.ReadInt64(); return(DateTimeOffset.FromUnixTimeSeconds(unixTime).DateTime); case CborDataItemType.Double: case CborDataItemType.Single: double unixTimeDouble = reader.ReadDouble(); return(DateTimeOffset.FromUnixTimeSeconds(0).DateTime.AddSeconds(unixTimeDouble)); default: throw reader.BuildException($"Invalid date format"); } }
public Type ReadDiscriminator(ref CborReader reader) { int discriminator = reader.ReadInt32(); if (!_typesByDiscriminator.TryGetValue(discriminator, out Type type)) { throw reader.BuildException($"Unknown type discriminator: {discriminator}"); } return(type); }
public T ReadString(ref CborReader reader) { ReadOnlySpan <byte> rawName = reader.ReadRawString(); if (!names2Values.TryGetValue(rawName, out T enumValue)) { throw reader.BuildException($"Unknown name {Encoding.ASCII.GetString(rawName)} for enum {typeof(T).Name}"); } return(enumValue); }
public Type ReadDiscriminator(ref CborReader reader) { string?discriminator = reader.ReadString(); if (discriminator == null) { throw reader.BuildException("Discrimnator cannot be null or empty"); } Type type = _typesByDiscriminator.GetOrAdd(discriminator, NameToType); return(type); }
public override CborValue Read(ref CborReader reader) { switch (reader.GetCurrentDataItemType()) { case CborDataItemType.Boolean: return(reader.ReadBoolean()); case CborDataItemType.Null: reader.ReadNull(); return(CborValue.Null); case CborDataItemType.Signed: return(reader.ReadInt64()); case CborDataItemType.Unsigned: return(reader.ReadUInt64()); case CborDataItemType.Single: return(reader.ReadSingle()); case CborDataItemType.Double: return(reader.ReadDouble()); case CborDataItemType.Decimal: return(reader.ReadDecimal()); case CborDataItemType.String: return(reader.ReadString()); case CborDataItemType.Array: return(((ICborConverter <CborArray>) this).Read(ref reader)); case CborDataItemType.Map: return(((ICborConverter <CborObject>) this).Read(ref reader)); case CborDataItemType.ByteString: return(reader.ReadByteString()); default: throw reader.BuildException("Unexpected data item type"); } }