Пример #1
0
        /// <inheritdoc />
        public object Read(CSStreamReader stream, string key, string genericTypeInfo, string dimensionInfo)
        {
            StringBuilder sb = new StringBuilder(128);

            while (stream.ReadChar(out char c))
            {
                switch (c)
                {
                case '[':
                {
                    stream.ReadEndTag(key);

                    genericTypeInfo.GetInnerType(out string bti, out string gti);
                    if (!string.IsNullOrEmpty(gti))
                    {
                        throw new CSReaderException(
                                  $"ERROR: AN ENUM CAN't BE A GENERIC TYPE -> {genericTypeInfo}");
                    }

                    Type enumType = bti.CreateType();
                    if (enumType.IsEnum)
                    {
                        return(Enum.Parse(enumType, sb.ToString()));
                    }
                    throw new CSReaderException($"ERROR: BASE TYPE ISN'T AN ENUM TYPE -> {bti}");
                }

                case ']':
                    throw new CSReaderException($"ERROR: INVALID CONTENT -> {sb}");
                }

                sb.Append(c);
            }
            throw new CSReaderException($"ERROR: INVALID FILE CONTENT! - > {sb}");
        }
Пример #2
0
        /// <inheritdoc />
        public object Read(CSStreamReader stream, string key, string genericTypeInfo, string dimensionInfo)
        {
            StringBuilder sb = new StringBuilder(128);

            while (stream.ReadChar(out char c))
            {
                switch (c)
                {
                //ESCAPE
                case '\\':
                {
                    if (!stream.ReadChar(out c))
                    {
                        throw new CSReaderException($"ERROR: UNEXPECTED END OF FILE! - > {sb}");
                    }
                }
                break;

                case '[':
                {
                    stream.ReadEndTag(key);
                    return(sb.ToString());
                }

                case ']':
                    throw new CSReaderException($"ERROR: INVALID CONTENT -> {sb}");
                }

                sb.Append(c);
            }
            throw new CSReaderException($"ERROR: INVALID FILE CONTENT! - > {sb}");
        }
Пример #3
0
        /// <inheritdoc />
        public object Read(CSStreamReader stream, string key, string genericTypeInfo, string dimensionInfo)
        {
            StringBuilder sb = new StringBuilder(32);

            while (stream.ReadChar(out char c))
            {
                switch (c)
                {
                case '[':
                {
                    stream.ReadEndTag(key);
                    string content = sb.ToString();
                    try
                    {
                        return(System.Convert.ChangeType(content, BaseType));
                    }
                    catch
                    {
                        throw new InvalidCastException(
                                  $"content '{content}' can't be converted to '{BaseType.FullName}'!");
                    }
                }

                case ']':
                case '\r':
                case '\n':
                case '\t':
                    throw new CSReaderException($"ERROR: INVALID CONTENT -> {sb}");
                }

                sb.Append(c);
            }
            throw new CSReaderException($"ERROR: INVALID FILE CONTENT! - > {sb}");
        }
Пример #4
0
        /// <summary>
        ///     Adds a list content.
        /// </summary>
        /// <typeparam name="T"> Generic type parameter. </typeparam>
        /// <param name="stream">       The stream. </param>
        /// <param name="readCallback"> The read callback. </param>
        /// <param name="list">         The list. </param>
        /// <param name="count">        Number of. </param>
        private static void AddListContent <T>(CSStreamReader stream,
                                               Func <CSStreamReader, string, object> readCallback,
                                               List <T> list,
                                               int count)
        {
            for (int i = 0; i < count; i++)
            {
                stream.ReadStartTag(out string _, out string dimensionInfo);

                list.Add((dynamic)readCallback(stream, dimensionInfo));
            }
        }
Пример #5
0
        /// <inheritdoc />
        public object Read(CSStreamReader stream, string key, string genericTypeInfo, string dimensionInfo)
        {
            if (string.IsNullOrEmpty(dimensionInfo))
            {
                throw new CSReaderException(
                          $"ERROR: NO DIMENSION INFO FOUND EXPECTED: DICTIONARY<GENERIC_TYPE_INFO1, GENERIC_TYPE_INFO2>(count) -> DICTIONARY{genericTypeInfo}{dimensionInfo}");
            }
            if (string.IsNullOrEmpty(genericTypeInfo))
            {
                throw new CSReaderException(
                          "ERROR: NO GENERIC TYPE INFO DEFINED -> DICTIONARY<GENERIC_TYPE_INFO1, GENERIC_TYPE_INFO2>");
            }

            genericTypeInfo.GetKeyValueInnerType(out string kbti, out string vbti, out string vgti);

            if (!ContentSerializer.s_types.TryGetValue(kbti, out IType itk) || !itk.IsPrimitive)
            {
                throw new NotSupportedException($"ERROR: INVALID KEY TYPE FOUND IN -> '{genericTypeInfo}'");
            }

            Type valueType;
            Func <CSStreamReader, string, object> readCallback;

            if (ContentSerializer.s_types.TryGetValue(vbti, out IType it))
            {
                valueType    = it.CreateType(vgti);
                readCallback = (s, d) =>
                {
                    return(it.Read(stream, string.Empty, vgti, d));
                };
            }
            else
            {
                valueType    = vbti.CreateType();
                readCallback = (s, d) =>
                {
                    return(ContentSerializer.Read(stream, valueType, string.Empty));
                };
            }

            int count = GetDictionaryCount(dimensionInfo);

            Type   dic = BaseType.MakeGenericType(itk.CreateType(string.Empty), valueType);
            object obj = System.Activator.CreateInstance(dic, count);

            AddDictionaryContent(stream, readCallback, (dynamic)obj, count);
            stream.ReadTag($"/{key}");
            return(obj);
        }
Пример #6
0
        /// <inheritdoc />
        public object Read(CSStreamReader stream, string key, string genericTypeInfo, string dimensionInfo)
        {
            if (string.IsNullOrEmpty(dimensionInfo))
            {
                throw new CSReaderException(
                          $"ERROR: NO DIMENSION INFO FOUND EXPECTED: LIST<GENERIC_TYPE_INFO>(count) -> LIST{genericTypeInfo}{dimensionInfo}");
            }
            if (string.IsNullOrEmpty(genericTypeInfo))
            {
                throw new CSReaderException("ERROR: NO GENERIC TYPE INFO DEFINED -> LIST<GENERIC_TYPE_INFO>");
            }

            genericTypeInfo.GetInnerType(out string bti, out string gti);

            Type elementType;
            Func <CSStreamReader, string, object> readCallback;

            if (ContentSerializer.s_types.TryGetValue(bti, out IType it))
            {
                elementType  = it.CreateType(gti);
                readCallback = (s, d) =>
                {
                    return(it.Read(stream, string.Empty, gti, d));
                };
            }
            else
            {
                elementType  = bti.CreateType();
                readCallback = (s, d) =>
                {
                    return(ContentSerializer.Read(stream, elementType, string.Empty));
                };
            }

            int count = GetListCount(dimensionInfo);

            Type   list = BaseType.MakeGenericType(elementType);
            object obj  = System.Activator.CreateInstance(list, count);

            AddListContent(stream, readCallback, (dynamic)obj, count);
            stream.ReadTag($"/{key}");
            return(obj);
        }
Пример #7
0
        /// <inheritdoc />
        public object Read(CSStreamReader stream, string key, string genericTypeInfo, string dimensionInfo)
        {
            if (string.IsNullOrEmpty(dimensionInfo))
            {
                throw new CSReaderException(
                          $"ERROR: NO DIMENSION INFO FOUND EXPECTED: ARRAY<GENERIC_TYPE_INFO>(d1,d2,...,dx) -> ARRAY{genericTypeInfo}{dimensionInfo}");
            }
            if (string.IsNullOrEmpty(genericTypeInfo))
            {
                throw new CSReaderException("ERROR: NO GENERIC TYPE INFO DEFINED -> ARRAY<GENERIC_TYPE_INFO>");
            }

            genericTypeInfo.GetInnerType(out string bti, out string gti);

            Type elementType;
            Func <CSStreamReader, string, object> readCallback;

            if (ContentSerializer.s_types.TryGetValue(bti, out IType it))
            {
                elementType  = it.CreateType(gti);
                readCallback = (s, d) =>
                {
                    return(it.Read(stream, string.Empty, gti, d));
                };
            }
            else
            {
                elementType  = bti.CreateType();
                readCallback = (s, d) =>
                {
                    return(ContentSerializer.Read(stream, elementType, string.Empty));
                };
            }

            int[] dimensions = GetArrayDimensionInfo(dimensionInfo);
            Array arr        = Array.CreateInstance(elementType, dimensions);

            AddArrayContent(stream, readCallback, arr, dimensions, new int[dimensions.Length], 0);
            stream.ReadTag($"/{key}");

            return(arr);
        }