public KeyValueSyntax GetOrCreateConfig([NotNull] string key)
        {
            var kvs = GetConfig(key);

            if (kvs != null)
            {
                return(kvs);
            }

            kvs = new KeyValueSyntax(key, new BareKeySyntax());
            _toml.KeyValues.Add(kvs);

            return(kvs);
        }
        public KeyValueSyntax GetOrCreateConfig([NotNull] TableSyntaxBase t, [NotNull] string key)
        {
            var kvs = GetConfig(t, key);

            if (kvs != null)
            {
                return(kvs);
            }

            kvs = new KeyValueSyntax(key, new BareKeySyntax());
            t.Items.Add(kvs);

            return(kvs);
        }
        private static void Set <T>(KeyValueSyntax entry, T value)
        {
            long iVal;

            switch (value)
            {
            // @formatter:off
            case bool v: entry.Value = new BooleanValueSyntax(v); break;

            case string v: entry.Value = new StringValueSyntax(v); break;

            case float v: entry.Value = new FloatValueSyntax(v); break;

            case double v: entry.Value = new FloatValueSyntax(v); break;

            case sbyte v: iVal = v; goto setIVal;

            case short v: iVal = v; goto setIVal;

            case int v: iVal = v; goto setIVal;

            case long v: iVal = v; goto setIVal;

            case byte v: iVal = v; goto setIVal;

            case ushort v: iVal = v; goto setIVal;

            case uint v: iVal = v; goto setIVal;

            case ulong v: iVal = (long)v; goto setIVal;

            // @formatter:on
            default:
                throw new NotImplementedException(typeof(T).FullName);
            }

            return;

setIVal:
            entry.Value = new IntegerValueSyntax(iVal);
        }
Beispiel #4
0
        public override void Visit(KeyValueSyntax keyValue)
        {
            if (_currentValue != null)
            {
                throw new InvalidOperationException("An KeyValue value must not have an active value.");
            }

            // Visit the key value, which will place the converted value into the current value
            keyValue.Value.Accept(this);
            if (_currentValue == null)
            {
                throw new InvalidOperationException("The current value must be set for KeyValue");
            }

            // Resolve the key
            var(currentTable, valueName) = ResolveKey(keyValue.Key);

            // Move the value into the reference
            currentTable[valueName] = _currentValue;
            _currentValue           = null;
        }
        private static void SaveClass(Type type, DocumentSyntax document, KeySyntax key = null)
        {
            key ??= new KeySyntax(type.Name);

            var fields   = type.GetFields(StaticFlags);
            var children = type.GetNestedTypes(StaticFlags);

            var table      = new TableSyntax(key);
            var tableItems = table.Items;

            foreach (var field in fields)
            {
                if (field.IsPrivate || field.IsInitOnly || !field.IsStatic || field.IsLiteral)
                {
                    continue;
                }

                if (field.GetCustomAttribute <Config.ConfigIgnoreAttribute>() != null)
                {
                    continue;
                }

                ValueSyntax value      = null;
                object      fieldValue = field.GetValue(null);

                switch (fieldValue)
                {
                case string v:
                    value = new StringValueSyntax(v);
                    break;

                case sbyte v:
                    value = new IntegerValueSyntax(v);
                    break;

                case byte v:
                    value = new IntegerValueSyntax(v);
                    break;

                case short v:
                    value = new IntegerValueSyntax(v);
                    break;

                case ushort v:
                    value = new IntegerValueSyntax(v);
                    break;

                case int v:
                    value = new IntegerValueSyntax(v);
                    break;

                case uint v:
                    value = new IntegerValueSyntax(v);
                    break;

                case ulong v:
                    value = new IntegerValueSyntax(unchecked ((long)v));
                    break;

                case float v:
                    value = new FloatValueSyntax(v);
                    break;

                case double v:
                    value = new FloatValueSyntax(v);
                    break;

                case bool v:
                    value = new BooleanValueSyntax(v);
                    break;

                default:
                    if (fieldValue is List <string> slist)
                    {
                        value = new ArraySyntax(slist.ToArray());
                    }
                    else if (fieldValue is List <int> ilist)
                    {
                        value = new ArraySyntax(ilist.ToArray());
                    }
                    else if (fieldValue.GetType().IsEnum)
                    {
                        value = new StringValueSyntax(fieldValue.GetType().GetEnumName(fieldValue));
                    }
                    break;
                }

                if (value == null)
                {
                    continue;
                }

                var keyValue = new KeyValueSyntax(
                    field.Name,
                    value
                    );

                //if (field.GetAttribute<Config.CommentAttribute>(out var attribute)) {
                //keyValue.GetChildren(Math.Max(0, keyValue.ChildrenCount - 2)).AddComment(attribute.Message);
                //}

                tableItems.Add(keyValue);
            }

            if (table.Items.ChildrenCount != 0)
            {
                document.Tables.Add(table);
            }

            foreach (var child in children)
            {
                if (child.IsNestedPrivate)
                {
                    continue;
                }
                if (child.GetCustomAttribute <Config.ConfigIgnoreAttribute>() != null)
                {
                    continue;
                }
                var childKey  = new KeySyntax(typeof(Config).Name);
                var parentKey = key.ToString().Split('.');
                if (parentKey.Length != 0)
                {
                    parentKey[0] = null;
                }
                foreach (var subKey in parentKey)
                {
                    if (subKey == null)
                    {
                        continue;
                    }
                    childKey.DotKeys.Add(new DottedKeyItemSyntax(subKey));
                }
                childKey.DotKeys.Add(new DottedKeyItemSyntax(child.Name));
                SaveClass(child, document, childKey);
            }
        }
 public override void Visit(KeyValueSyntax keyValue)
 {
     keyValue.Value.Accept(this);
     SetKeyValue(keyValue.Key, _currentValue, keyValue.Kind);
 }
Beispiel #7
0
        public void SetProperties(IDictionary <string, string> value)
        {
            ValueTable?values;

            if (_table.TryGetValue(Property_Properties, out var propertiesValues))
            {
                values = (ValueTable)propertiesValues.AsTable();
            }
            else
            {
                var newTableSyntax = new InlineTableSyntax()
                {
                    OpenBrace  = SyntaxFactory.Token(TokenKind.OpenBrace),
                    CloseBrace = SyntaxFactory.Token(TokenKind.CloseBrace),
                };
                values = new ValueTable()
                {
                    MirrorSyntax = newTableSyntax,
                };
                _table[Property_Properties] = new Value(values);

                // Add the new syntax to the parent table syntax
                switch (_table.MirrorSyntax)
                {
                case TableSyntaxBase tableSyntax:
                    tableSyntax.Items.Add(new KeyValueSyntax(Property_Properties, newTableSyntax));
                    break;

                default:
                    throw new InvalidOperationException("Unknown Syntax on ValueTable");
                }
            }

            // Add the new syntax to the parent table syntax
            // values.();
            switch (values.MirrorSyntax)
            {
            case InlineTableSyntax tableSyntax:
                // Replace all items
                while (tableSyntax.Items.ChildrenCount > 0)
                {
                    tableSyntax.Items.RemoveChildrenAt(0);
                }

                var index = 0;
                foreach (var item in value)
                {
                    bool isLastItem = index == value.Keys.Count - 1;
                    var  equalToken = SyntaxFactory.Token(TokenKind.Equal);
                    equalToken.AddLeadingWhitespace();
                    equalToken.AddTrailingWhitespace();
                    var newKeyValue = new KeyValueSyntax()
                    {
                        Key        = new KeySyntax(item.Key),
                        EqualToken = equalToken,
                        Value      = new StringValueSyntax(item.Value),
                    };
                    var newInlineTableItem = new InlineTableItemSyntax(newKeyValue)
                    {
                    };
                    if (!isLastItem)
                    {
                        newInlineTableItem.Comma = SyntaxFactory.Token(TokenKind.Comma);
                    }

                    // newInlineTableItem.LeadingTrivia = new List<SyntaxTrivia>() { SyntaxFactory.Whitespace() };
                    tableSyntax.Items.Add(newInlineTableItem);
                    index++;
                }
                break;

            default:
                throw new InvalidOperationException("Unknown Syntax on ValueList");
            }
        }