< Summary

Class:Kemocade.Vrc.Data.Extensions.DataTokenExtensions
Assembly:Kemocade.Vrc.Data.Extensions
File(s):File 1: /github/workspace/TestProject/Assets/com.kemocade.vrc.data.extensions/Runtime/DataTokenExtensions/Cast.cs
File 2: /github/workspace/TestProject/Assets/com.kemocade.vrc.data.extensions/Runtime/DataTokenExtensions/CastArray.cs
File 3: /github/workspace/TestProject/Assets/com.kemocade.vrc.data.extensions/Runtime/DataTokenExtensions/TryCast.cs
File 4: /github/workspace/TestProject/Assets/com.kemocade.vrc.data.extensions/Runtime/DataTokenExtensions/TryCastArray.cs
Covered lines:188
Uncovered lines:0
Coverable lines:188
Total lines:369
Line coverage:100% (188 of 188)
Covered branches:0
Total branches:0
Covered methods:4
Total methods:4
Method coverage:100% (4 of 4)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
File 1: Cast[T](...)0%000100%
File 2: CastArray[T](...)0%000100%
File 3: TryCast[T](...)0%000100%
File 4: TryCastArray[T](...)0%000100%

File(s)

/github/workspace/TestProject/Assets/com.kemocade.vrc.data.extensions/Runtime/DataTokenExtensions/Cast.cs

#LineLine coverage
 1using VRC.SDK3.Data;
 2using static Kemocade.Vrc.Data.Extensions.Shared;
 3
 4namespace Kemocade.Vrc.Data.Extensions
 5{
 6    public static partial class DataTokenExtensions
 7    {
 8        // TODO: special error message if passed in array type (use CastArray instead!)
 9        // If the cast fails, force an exception
 10        public static T Cast<T>(this DataToken input) =>
 311            input.TryCast(out T result) ?
 12            result : ForceException<T>();
 13    }
 14}

/github/workspace/TestProject/Assets/com.kemocade.vrc.data.extensions/Runtime/DataTokenExtensions/CastArray.cs

#LineLine coverage
 1using VRC.SDK3.Data;
 2using static Kemocade.Vrc.Data.Extensions.Shared;
 3
 4namespace Kemocade.Vrc.Data.Extensions
 5{
 6    public static partial class DataTokenExtensions
 7    {
 8        // TODO: special error message if passed in non-array type (use Cast instead!)
 9        // If the cast fails, force an exception
 10        public static T[] CastArray<T>(this DataToken input) =>
 111            input.TryCastArray(out T[] result) ?
 12            result : ForceException<T[]>();
 13    }
 14}

/github/workspace/TestProject/Assets/com.kemocade.vrc.data.extensions/Runtime/DataTokenExtensions/TryCast.cs

#LineLine coverage
 1using System;
 2using VRC.SDK3.Data;
 3
 4namespace Kemocade.Vrc.Data.Extensions
 5{
 6    public static partial class DataTokenExtensions
 7    {
 8        private const string BOOL = "System.Boolean";
 9        private const string SBYTE = "System.SByte";
 10        private const string BYTE = "System.Byte";
 11        private const string SHORT = "System.Int16";
 12        private const string USHORT = "System.UInt16";
 13        private const string INT = "System.Int32";
 14        private const string UINT = "System.UInt32";
 15        private const string LONG = "System.Int64";
 16        private const string ULONG = "System.UInt64";
 17        private const string FLOAT = "System.Single";
 18        private const string DOUBLE = "System.Double";
 19        private const string STRING = "System.String";
 20        private const string DATA_LIST = "VRC.SDK3.Data.DataList";
 21        private const string DATA_DICTIONARY = "VRC.SDK3.Data.DataDictionary";
 22        private const string OBJECT = "System.Object";
 23        private const string DECIMAL = "System.Decimal";
 24
 25        // TODO: special error message if passed in array type (use TryCastArray instead!)
 26        public static bool TryCast<T>(this DataToken input, out T result)
 37027        {
 37028            object data = null;
 37029            Type type = typeof(T);
 30
 37031            switch (input.TokenType)
 32            {
 33                case TokenType.Boolean:
 434                    switch (typeof(T).FullName)
 35                    {
 36                        // Self
 37                        case BOOL:
 438                        case OBJECT: data = input.Boolean; break;
 39                        // String
 240                        case STRING: data = input.Boolean.ToString(); break;
 41                    }
 442                    break;
 43                case TokenType.SByte:
 1444                    switch (typeof(T).FullName)
 45                    {
 46                        // Self
 47                        case SBYTE:
 448                        case OBJECT: data = input.SByte; break;
 49                        // Implicit
 250                        case SHORT: data = (short)input.SByte; break;
 451                        case INT: data = (int)input.SByte; break;
 252                        case LONG: data = (long)input.SByte; break;
 253                        case FLOAT: data = (float)input.SByte; break;
 254                        case DOUBLE: data = (double)input.SByte; break;
 255                        case DECIMAL: data = (decimal)input.SByte; break;
 56                        // Explicit
 257                        case BYTE: data = (byte)input.SByte; break;
 258                        case USHORT: data = (ushort)input.SByte; break;
 259                        case UINT: data = (uint)input.SByte; break;
 260                        case ULONG: data = (ulong)input.SByte; break;
 61                        // String
 262                        case STRING: data = input.SByte.ToString(); break;
 63                    }
 1464                    break;
 65                case TokenType.Byte:
 1466                    switch (typeof(T).FullName)
 67                    {
 68                        // Self
 69                        case BYTE:
 470                        case OBJECT: data = input.Byte; break;
 71                        // Implicit
 272                        case SHORT: data = (short)input.Byte; break;
 273                        case USHORT: data = (ushort)input.Byte; break;
 474                        case INT: data = (int)input.Byte; break;
 275                        case UINT: data = (uint)input.Byte; break;
 276                        case LONG: data = (long)input.Byte; break;
 277                        case ULONG: data = (ulong)input.Byte; break;
 278                        case FLOAT: data = (float)input.Byte; break;
 279                        case DOUBLE: data = (double)input.Byte; break;
 280                        case DECIMAL: data = (decimal)input.Byte; break;
 81                        // Explicit
 282                        case SBYTE: data = (sbyte)input.Byte; break;
 83                        // String
 284                        case STRING: data = input.Byte.ToString(); break;
 85                    }
 1486                    break;
 87                case TokenType.Short:
 1488                    switch (typeof(T).FullName)
 89                    {
 90                        // Self
 91                        case SHORT:
 492                        case OBJECT: data = input.Short; break;
 93                        // Implicit
 494                        case INT: data = (int)input.Short; break;
 295                        case LONG: data = (long)input.Short; break;
 296                        case FLOAT: data = (float)input.Short; break;
 297                        case DOUBLE: data = (double)input.Short; break;
 298                        case DECIMAL: data = (decimal)input.Short; break;
 99                        // Explicit
 2100                        case SBYTE: data = (sbyte)input.Short; break;
 2101                        case BYTE: data = (byte)input.Short; break;
 2102                        case USHORT: data = (ushort)input.Short; break;
 2103                        case UINT: data = (uint)input.Short; break;
 2104                        case ULONG: data = (ulong)input.Short; break;
 105                        // String
 2106                        case STRING: data = input.Short.ToString(); break;
 107                    }
 14108                    break;
 109                case TokenType.UShort:
 14110                    switch (typeof(T).FullName)
 111                    {
 112                        // Self
 113                        case USHORT:
 4114                        case OBJECT: data = input.UShort; break;
 115                        // Implicit
 4116                        case INT: data = (int)input.UShort; break;
 2117                        case UINT: data = (uint)input.UShort; break;
 2118                        case LONG: data = (long)input.UShort; break;
 2119                        case ULONG: data = (ulong)input.UShort; break;
 2120                        case FLOAT: data = (float)input.UShort; break;
 2121                        case DOUBLE: data = (double)input.UShort; break;
 2122                        case DECIMAL: data = (decimal)input.UShort; break;
 123                        // Explicit
 2124                        case SBYTE: data = (sbyte)input.UShort; break;
 2125                        case BYTE: data = (byte)input.UShort; break;
 2126                        case SHORT: data = (short)input.UShort; break;
 127                        // String
 2128                        case STRING: data = input.UShort.ToString(); break;
 129                    }
 14130                    break;
 131                case TokenType.Int:
 30132                    switch (typeof(T).FullName)
 133                    {
 134                        // Self
 135                        case INT:
 34136                        case OBJECT: data = input.Int; break;
 137                        // Implicit
 2138                        case LONG: data = (long)input.Int; break;
 4139                        case FLOAT: data = (float)input.Int; break;
 2140                        case DOUBLE: data = (double)input.Int; break;
 2141                        case DECIMAL: data = (decimal)input.Int; break;
 142                        // Explicit
 2143                        case SBYTE: data = (sbyte)input.Int; break;
 2144                        case BYTE: data = (byte)input.Int; break;
 2145                        case SHORT: data = (short)input.Int; break;
 2146                        case USHORT: data = (ushort)input.Int; break;
 2147                        case UINT: data = (uint)input.Int; break;
 2148                        case ULONG: data = (ulong)input.Int; break;
 149                        // String
 4150                        case STRING: data = input.Int.ToString(); break;
 151                    }
 30152                    break;
 153                case TokenType.UInt:
 14154                    switch (typeof(T).FullName)
 155                    {
 156                        // Self
 157                        case UINT:
 4158                        case OBJECT: data = input.UInt; break;
 159                        // Implicit
 2160                        case LONG: data = (long)input.UInt; break;
 2161                        case ULONG: data = (ulong)input.UInt; break;
 2162                        case FLOAT: data = (float)input.UInt; break;
 2163                        case DOUBLE: data = (double)input.UInt; break;
 2164                        case DECIMAL: data = (decimal)input.UInt; break;
 165                        // Explicit
 2166                        case SBYTE: data = (sbyte)input.UInt; break;
 2167                        case BYTE: data = (byte)input.UInt; break;
 2168                        case SHORT: data = (short)input.UInt; break;
 2169                        case USHORT: data = (ushort)input.UInt; break;
 4170                        case INT: data = (int)input.UInt; break;
 171                        // String
 2172                        case STRING: data = input.UInt.ToString(); break;
 173                    }
 14174                    break;
 175                case TokenType.Long:
 14176                    switch (typeof(T).FullName)
 177                    {
 178                        // Self
 179                        case LONG:
 4180                        case OBJECT: data = input.Long; break;
 181                        // Implicit
 2182                        case FLOAT: data = (float)input.Long; break;
 2183                        case DOUBLE: data = (double)input.Long; break;
 2184                        case DECIMAL: data = (decimal)input.Long; break;
 185                        // Explicit
 2186                        case SBYTE: data = (sbyte)input.Long; break;
 2187                        case BYTE: data = (byte)input.Long; break;
 2188                        case SHORT: data = (short)input.Long; break;
 2189                        case USHORT: data = (ushort)input.Long; break;
 4190                        case INT: data = (int)input.Long; break;
 2191                        case UINT: data = (uint)input.Long; break;
 2192                        case ULONG: data = (ulong)input.Long; break;
 193                        // String
 2194                        case STRING: data = input.Long.ToString(); break;
 195                    }
 14196                    break;
 197                case TokenType.ULong:
 14198                    switch (typeof(T).FullName)
 199                    {
 200                        // Self
 201                        case ULONG:
 4202                        case OBJECT: data = input.ULong; break;
 203                        // Implicit
 2204                        case FLOAT: data = (float)input.ULong; break;
 2205                        case DOUBLE: data = (double)input.ULong; break;
 2206                        case DECIMAL: data = (decimal)input.ULong; break;
 207                        // Explicit
 2208                        case SBYTE: data = (sbyte)input.ULong; break;
 2209                        case BYTE: data = (byte)input.ULong; break;
 2210                        case SHORT: data = (short)input.ULong; break;
 2211                        case USHORT: data = (ushort)input.ULong; break;
 4212                        case INT: data = (int)input.ULong; break;
 2213                        case UINT: data = (uint)input.ULong; break;
 2214                        case LONG: data = (long)input.ULong; break;
 215                        // String
 2216                        case STRING: data = input.ULong.ToString(); break;
 217                    }
 14218                    break;
 219                case TokenType.Float:
 15220                    switch (typeof(T).FullName)
 221                    {
 222                        // Self
 223                        case FLOAT:
 4224                        case OBJECT: data = input.Float; break;
 225                        // Implicit
 2226                        case DOUBLE: data = (double)input.Float; break;
 227                        // Explicit
 2228                        case SBYTE: data = (sbyte)input.Float; break;
 2229                        case BYTE: data = (byte)input.Float; break;
 2230                        case SHORT: data = (short)input.Float; break;
 2231                        case USHORT: data = (ushort)input.Float; break;
 6232                        case INT: data = (int)input.Float; break;
 2233                        case UINT: data = (uint)input.Float; break;
 2234                        case LONG: data = (long)input.Float; break;
 2235                        case ULONG: data = (ulong)input.Float; break;
 2236                        case DECIMAL: data = (decimal)input.Float; break;
 237                        // String
 2238                        case STRING: data = input.Float.ToString(); break;
 239                    }
 15240                    break;
 241                case TokenType.Double:
 29242                    switch (typeof(T).FullName)
 243                    {
 244                        // Self
 245                        case DOUBLE:
 4246                        case OBJECT: data = input.Double; break;
 247                        // Explicit
 2248                        case SBYTE: data = (sbyte)input.Double; break;
 2249                        case BYTE: data = (byte)input.Double; break;
 2250                        case SHORT: data = (short)input.Double; break;
 2251                        case USHORT: data = (ushort)input.Double; break;
 30252                        case INT: data = (int)input.Double; break;
 2253                        case UINT: data = (uint)input.Double; break;
 2254                        case LONG: data = (long)input.Double; break;
 2255                        case ULONG: data = (ulong)input.Double; break;
 2256                        case FLOAT: data = (float)input.Double; break;
 2257                        case DECIMAL: data = (decimal)input.Double; break;
 258                        // String
 2259                        case STRING: data = input.Double.ToString(); break;
 260                    }
 29261                    break;
 262                case TokenType.String:
 119263                    switch (typeof(T).FullName)
 264                    {
 265                        // Self
 266                        case STRING:
 210267                        case OBJECT: data = input.String; break;
 268                        // Parsed
 5269                        case BOOL: if (bool.TryParse(input.String, out bool boolP)) { data = boolP; } break;
 5270                        case SBYTE: if (sbyte.TryParse(input.String, out sbyte sbyteP)) { data = sbyteP; } break;
 5271                        case BYTE: if (byte.TryParse(input.String, out byte byteP)) { data = byteP; } break;
 5272                        case SHORT: if (short.TryParse(input.String, out short shortP)) { data = shortP; } break;
 5273                        case USHORT: if (ushort.TryParse(input.String, out ushort ushortP)) { data = ushortP; } break;
 12274                        case INT: if (int.TryParse(input.String, out int intP)) { data = intP; } break;
 5275                        case UINT: if (uint.TryParse(input.String, out uint uintP)) { data = uintP; } break;
 5276                        case LONG: if (long.TryParse(input.String, out long longP)) { data = longP; } break;
 5277                        case ULONG: if (ulong.TryParse(input.String, out ulong ulongP)) { data = ulongP; } break;
 5278                        case FLOAT: if (float.TryParse(input.String, out float floatP)) { data = floatP; } break;
 5279                        case DOUBLE: if (double.TryParse(input.String, out double doubleP)) { data = doubleP; } break;
 5280                        case DECIMAL: if (decimal.TryParse(input.String, out decimal decimalP)) { data = decimalP; } bre
 281                    }
 119282                    break;
 283                case TokenType.DataList:
 4284                    switch (typeof(T).FullName)
 285                    {
 286                        // Self
 287                        case DATA_LIST:
 4288                        case OBJECT: data = input.DataList; break;
 289                    }
 4290                    break;
 291                case TokenType.DataDictionary:
 69292                    switch (typeof(T).FullName)
 293                    {
 294                        // Self
 295                        case DATA_DICTIONARY:
 136296                        case OBJECT: data = input.DataDictionary; break;
 297                    }
 69298                    break;
 299                case TokenType.Reference:
 300                    // Self
 2301                    switch (typeof(T).FullName)
 302                    {
 303                        // Self
 2304                        case OBJECT: data = input.Reference; break;
 305                    }
 2306                    break;
 307            }
 308
 370309            if (data == null)
 8310            {
 8311                result = default;
 8312                return false;
 313            }
 314
 362315            result = (T)data;
 362316            return true;
 370317        }
 318    }
 319}

/github/workspace/TestProject/Assets/com.kemocade.vrc.data.extensions/Runtime/DataTokenExtensions/TryCastArray.cs

#LineLine coverage
 1using VRC.SDK3.Data;
 2
 3namespace Kemocade.Vrc.Data.Extensions
 4{
 5    public static partial class DataTokenExtensions
 6    {
 7        public static bool TryCastArray<T>(this DataToken token, out T[] result)
 578        {
 579            if
 10            (
 11                token.TokenType != TokenType.DataList ||
 12                !token.DataList.TryCastArray(out result)
 13            )
 214            {
 215                result = default;
 216                return false;
 17            }
 18
 5519            return true;
 5720        }
 21    }
 22}