예제 #1
0
        void WriteValue(OclStringLiteral literal)
        {
            if (literal.Format == OclStringLiteralFormat.SingleLine)
            {
                WriteSingleLineStringLiteral(literal.Value);
                return;
            }

            var isIndented = literal.Format == OclStringLiteralFormat.IndentedHeredoc;

            writer.Write("<<");
            if (isIndented)
            {
                writer.Write("-");
            }
            writer.WriteLine(literal.HeredocTag);

            var lines = literal.Value.Split('\n');

            for (var x = 0; x < lines.Length; x++)
            {
                if (x > 0)
                {
                    writer.Write('\n');
                }

                if (isIndented)
                {
                    WriteIndent(2);
                }
                writer.Write(lines[x]);
            }

            writer.WriteLine();

            if (isIndented)
            {
                WriteIndent(1);
            }
            writer.Write(literal.HeredocTag);
        }
예제 #2
0
        void WriteValue(object?value)
        {
            if (value == null)
            {
                writer.Write("null");
                return;
            }

            switch (value)
            {
            case bool b:
                writer.Write(b ? "true" : "false");
                return;

            case byte b:
                writer.Write(b);
                return;

            case ushort s:
                writer.Write(s);
                return;

            case short s:
                writer.Write(s);
                return;

            case uint i:
                writer.Write(i);
                return;

            case int i:
                writer.Write(i);
                return;

            case ulong l:
                writer.Write(l);
                return;

            case long l:
                writer.Write(l);
                return;

            case float f:
                writer.Write(f);
                return;

            case double d:
                writer.Write(d);
                return;

            case decimal d:
                writer.Write(d);
                return;

            case char c:
                WriteSingleLineStringLiteral(c.ToString());
                return;

            case string s:
                var literal = OclStringLiteral.Create(s);
                literal.HeredocTag = Options.DefaultHeredocTag;
                WriteValue(literal);
                return;

            case OclStringLiteral s:
                WriteValue(s);
                return;
            }

            var valueType = value.GetType();

            if (OclAttribute.IsObjectDictionary(valueType))
            {
                WriteValue((IReadOnlyDictionary <string, object?>)value);
                return;
            }

            if (OclAttribute.IsStringDictionary(valueType))
            {
                WriteValue((IReadOnlyDictionary <string, string>)value);
                return;
            }

            if (OclAttribute.IsSupportedValueCollectionType(valueType))
            {
                var enumerable = (IEnumerable)value;
                writer.Write('[');
                var isFirst = true;
                foreach (var item in enumerable)
                {
                    if (!isFirst)
                    {
                        writer.Write(", ");
                    }
                    isFirst = false;
                    WriteValue(item);
                }

                writer.Write(']');
                return;
            }

            throw new InvalidOperationException($"The type {value.GetType().FullName} is not a valid attribute value and can not be serialized");
        }