Пример #1
0
        private static void ScanDeclarations(IEnumerable <XElement> elements, out ExtendedKeyedCollection <string, PropertyDefinition> properties, out ExtendedKeyedCollection <string, Variable> variables)
        {
            properties = null;
            variables  = null;

            foreach (XElement element in elements)
            {
                switch (element.Kind())
                {
                case ElementKind.Variable:
                {
                    variables = variables ?? new ExtendedKeyedCollection <string, Variable>(DefaultComparer.StringComparer);

                    string variableName = element.AttributeValueOrThrow(AttributeNames.Name);

                    if (variables.Contains(variableName))
                    {
                        Throw(ErrorMessages.ItemAlreadyDefined(ElementNames.Variable, variableName), element);
                    }

                    var variable = new Variable(
                        variableName,
                        element.AttributeValueOrThrow(AttributeNames.Value));

                    variables.Add(variable);
                    break;
                }

                case ElementKind.Property:
                {
                    properties = properties ?? new ExtendedKeyedCollection <string, PropertyDefinition>();

                    string propertyName = element.AttributeValueOrThrow(AttributeNames.Name);

                    if (properties.Contains(propertyName))
                    {
                        Throw(ErrorMessages.ItemAlreadyDefined(ElementNames.Property, propertyName), element);
                    }

                    var property = new PropertyDefinition(
                        propertyName,
                        element.AttributeValueOrDefault(AttributeNames.DefaultValue),
                        element.AttributeValueAsBooleanOrDefault(AttributeNames.IsCollection),
                        element.AttributeValueAsBooleanOrDefault(AttributeNames.IsRequired),
                        element);

                    properties.Add(property);
                    break;
                }

                default:
                {
                    ThrowOnUnknownElement(element);
                    break;
                }
                }
            }
        }
Пример #2
0
        private static void ScanDeclarations(IEnumerable <XElement> elements, out ExtendedKeyedCollection <string, PropertyDefinition> properties, out ExtendedKeyedCollection <string, Variable> variables)
        {
            properties = null;
            variables  = null;

            foreach (XElement element in elements)
            {
                switch (element.Kind())
                {
                case ElementKind.Variable:
                {
                    variables = variables ?? new ExtendedKeyedCollection <string, Variable>(DefaultComparer.StringComparer);

                    string variableName = element.AttributeValueOrThrow(AttributeNames.Name);

                    if (variables.Contains(variableName))
                    {
                        Throw(ErrorMessages.ItemAlreadyDefined(ElementNames.Variable, variableName), element);
                    }

                    var variable = new Variable(
                        variableName,
                        element.AttributeValueOrThrow(AttributeNames.Value));

                    variables.Add(variable);
                    break;
                }

                case ElementKind.Property:
                {
                    properties = properties ?? new ExtendedKeyedCollection <string, PropertyDefinition>();

                    string name         = null;
                    bool   isCollection = false;
                    bool   isRequired   = false;
                    string defaultValue = null;
                    string description  = null;

                    foreach (XAttribute attribute in element.Attributes())
                    {
                        switch (attribute.LocalName())
                        {
                        case AttributeNames.Name:
                        {
                            name = attribute.Value;
                            break;
                        }

                        case AttributeNames.IsCollection:
                        {
                            isCollection = bool.Parse(attribute.Value);
                            break;
                        }

                        case AttributeNames.IsRequired:
                        {
                            isRequired = bool.Parse(attribute.Value);
                            break;
                        }

                        case AttributeNames.DefaultValue:
                        {
                            defaultValue = attribute.Value;
                            break;
                        }

                        case AttributeNames.Description:
                        {
                            description = attribute.Value;
                            break;
                        }

                        default:
                        {
                            Throw(ErrorMessages.UnknownAttribute(attribute), element);
                            break;
                        }
                        }
                    }

                    if (properties.Contains(name))
                    {
                        Throw(ErrorMessages.ItemAlreadyDefined(ElementNames.Property, name), element);
                    }

                    if (isCollection &&
                        defaultValue != null)
                    {
                        Throw(ErrorMessages.CollectionPropertyCannotDefineDefaultValue(), element);
                    }

                    var property = new PropertyDefinition(
                        name,
                        isCollection,
                        isRequired,
                        defaultValue,
                        description,
                        element);

                    properties.Add(property);
                    break;
                }

                default:
                {
                    ThrowOnUnknownElement(element);
                    break;
                }
                }
            }
        }