using System;
using System.Collections.Generic;

namespace Capnp
{
    /// <summary>
    /// ListDeserializer specialization for empty lists.
    /// </summary>
    public class EmptyListDeserializer : ListDeserializer
    {
        /// <summary>
        /// Always ListKind.ListOfEmpty (despite the fact the empty list != List(Void)
        /// </summary>
        public override ListKind Kind => ListKind.ListOfEmpty;

        /// <summary>
        /// Returns am empty <see cref="IReadOnlyList{T}"/>.
        /// </summary>
        /// <typeparam name="T">Element ype</typeparam>
        /// <param name="cons">Ignored</param>
        public override IReadOnlyList<T> Cast<T>(Func<DeserializerState, T> cons) => new EmptyList<T>();

        /// <summary>
        /// Returns an empty <code><![CDATA[IReadOnlyList<bool>]]></code>/>.
        /// </summary>
        public override IReadOnlyList<bool> CastBool() => new EmptyList<bool>();

        /// <summary>
        /// Returns an empty <code><![CDATA[IReadOnlyList<byte>]]></code>/>.
        /// </summary>
        public override IReadOnlyList<byte> CastByte() => new EmptyList<byte>();

        /// <summary>
        /// Returns an empty <code><![CDATA[IReadOnlyList<double>]]></code>/>.
        /// </summary>
        public override IReadOnlyList<double> CastDouble() => new EmptyList<double>();

        /// <summary>
        /// Returns an empty <code><![CDATA[IReadOnlyList<float>]]></code>.
        /// </summary>
        public override IReadOnlyList<float> CastFloat() => new EmptyList<float>();

        /// <summary>
        /// Returns an empty <code><![CDATA[IReadOnlyList<int>]]></code>.
        /// </summary>
        public override IReadOnlyList<int> CastInt() => new EmptyList<int>();

        /// <summary>
        /// Returns an empty <code><![CDATA[IReadOnlyList<ListDeserializer>]]></code>.
        /// </summary>
        public override IReadOnlyList<ListDeserializer> CastList() => new EmptyList<ListDeserializer>();

        /// <summary>
        /// Returns an empty <code><![CDATA[IReadOnlyList<long>]]></code>/>.
        /// </summary>
        public override IReadOnlyList<long> CastLong() => new EmptyList<long>();

        /// <summary>
        /// Returns an empty <code><![CDATA[IReadOnlyList<sbyte>]]></code>.
        /// </summary>
        public override IReadOnlyList<sbyte> CastSByte() => new EmptyList<sbyte>();

        /// <summary>
        /// Returns an empty <code><![CDATA[IReadOnlyList<short>]]></code>.
        /// </summary>
        public override IReadOnlyList<short> CastShort() => new EmptyList<short>();

        /// <summary>
        /// Returns an empty string.
        /// </summary>
        public override string CastText() => string.Empty;

        /// <summary>
        /// Returns an empty <code><![CDATA[IReadOnlyList<uint>]]></code>.
        /// </summary>
        public override IReadOnlyList<uint> CastUInt() => new EmptyList<uint>();

        /// <summary>
        /// Returns an empty <code><![CDATA[IReadOnlyList<ulong>]]></code>.
        /// </summary>
        public override IReadOnlyList<ulong> CastULong() => new EmptyList<ulong>();

        /// <summary>
        /// Returns an empty <code><![CDATA[IReadOnlyList<ushort>]]></code>.
        /// </summary>
        public override IReadOnlyList<ushort> CastUShort() => new EmptyList<ushort>();
    }
}