/// <summary>
/// Reads the CqlType
/// </summary>
/// <param name="reader">The reader.</param>
/// <returns>a CqlType</returns>
private static async Task<CqlType> ReadCqlType(FrameReader reader)
{
//read typeCode
var colType = (CqlTypeCode)await reader.ReadShortAsync().AutoConfigureAwait();
CqlType type;
switch(colType)
{
case CqlTypeCode.Custom:
var colCustom = await reader.ReadStringAsync().AutoConfigureAwait();
type = CqlType.CreateType(colCustom);
break;
case CqlTypeCode.List:
case CqlTypeCode.Set:
var colValueType = await ReadCqlType(reader).AutoConfigureAwait();
type = CqlType.CreateType(colType, colValueType);
break;
case CqlTypeCode.Map:
var colKeyType = await ReadCqlType(reader).AutoConfigureAwait();
var colValType = await ReadCqlType(reader).AutoConfigureAwait();
type = CqlType.CreateType(colType, colKeyType, colValType);
break;
case CqlTypeCode.UserDefinedType:
var keyspace = await reader.ReadStringAsync().AutoConfigureAwait();
var name = await reader.ReadStringAsync().AutoConfigureAwait();
var fieldCount = await reader.ReadShortAsync().AutoConfigureAwait();
var fieldNames = new List<string>(fieldCount);
var fieldTypes = new List<CqlType>(fieldCount);
for(int i = 0; i < fieldCount; i++)
{
fieldNames.Add(await reader.ReadStringAsync().AutoConfigureAwait());
fieldTypes.Add(await ReadCqlType(reader).AutoConfigureAwait());
}
type = CqlType.CreateType(colType, keyspace, name, fieldNames, fieldTypes);
break;
case CqlTypeCode.Tuple:
var tupleItems = await reader.ReadShortAsync().AutoConfigureAwait();
var tupleItemTypes = new object[tupleItems];
for(int i = 0; i < tupleItems; i++)
{
tupleItemTypes[i] = await ReadCqlType(reader).AutoConfigureAwait();
}
type = CqlType.CreateType(colType, tupleItemTypes);
break;
default:
type = CqlType.CreateType(colType);
break;
}
return type;
}