Exemplo n.º 1
0
        /// <summary>
        /// Recursive method to apply a node with all its variants and
        /// children to an Option.
        /// </summary>
        private void LoadNode(Option option, ValueStore.Node node, bool isDefaultNode = false)
        {
            if (!isDefaultNode && option.IsDefaultVariant)
            {
                // Load default variant sub-node into the main variant option
                // (The container node's value is ignored)
                var defaultNode = node.GetVariant(option.VariantDefaultParameter);
                if (defaultNode != null)
                {
                    LoadNode(option, defaultNode, isDefaultNode: true);
                }

                if (node.VariantCount > 0)
                {
                    foreach (var variantNode in node.Variants)
                    {
                        if (variantNode.Name.EqualsIgnoringCase(option.VariantDefaultParameter))
                        {
                            continue;
                        }
                        loaded.Add(variantNode.Name);
                        var variantOption = option.GetVariant(variantNode.Name);
                        LoadNode(variantOption, variantNode);
                    }

                    // Remove variants that don't exist in the node
                    variantsCopy.AddRange(option.Variants);
                    foreach (var variantOption in variantsCopy)
                    {
                        if (!loaded.Contains(variantOption.VariantParameter))
                        {
                            option.RemoveVariant(variantOption);
                        }
                    }
                    variantsCopy.Clear();
                    loaded.Clear();
                }
                else
                {
                    option.ClearVariants();
                }
            }
            else
            {
                option.Load(node.Value ?? string.Empty);

                if (node.ChildCount > 0)
                {
                    foreach (var childNode in node.Children)
                    {
                        var childOption = option.GetChild(childNode.Name);
                        if (childOption != null)
                        {
                            LoadNode(childOption, childNode);
                        }
                    }
                }
            }
        }