public static string Generate(SourceDefinition source)
        {
            IEnumerable <ValidatorGroups[]> paths;

            switch (source.ValueType)
            {
            case ValueType.Value:
                paths = Data.ValueValidationPaths;
                break;

            case ValueType.Array:
                paths = Data.ArrayValidationPaths;
                break;

            default:
                return(String.Empty);
            }

            var root = new ExtensionPathNode(null, null);

            foreach (var path in paths)
            {
                AddValidators(root, path);
            }

            var extensions = ExtensionGenerator.GenerateInvertExtensionOne(source)
                             .Concat(GenerateExtensions(source, root));

            var header = _header.Replace("__StateValidator__", source.GetSourceName(Option.None <string>()));

            return($"{header}{String.Join($"{Environment.NewLine}{Environment.NewLine}", extensions)}{_footer}");
        }
Beispiel #2
0
        private static void AddValidators(ExtensionPathNode current, IEnumerable <ValidatorGroups> validators)
        {
            if (!validators.Any())
            {
                return;
            }

            var validator = validators.First();

            foreach (var extension in Data.Extensions.Where(e => e.Validator.Identifier == validator))
            {
                if (current.TryGetOrAddChild(extension, out var node))
                {
                    AddValidators(node, validators.Skip(1));
                }
            }
        }
        public bool TryGetOrAddChild(ExtensionDefinition extension, out ExtensionPathNode node)
        {
            if (!DataType.Match(value => extension.DataType.Match(newValue => newValue == value, () => true), () => true))
            {
                node = null;
                return(false);
            }

            _extensions.Add(extension);

            if (!_children.TryGetValue(extension.Validator, out var child))
            {
                child = new ExtensionPathNode(extension.Validator, this);

                _children.Add(extension.Validator, child);
            }

            node = child;
            return(true);
        }
 public ExtensionPathNode(ValidatorDefinition validator, ExtensionPathNode parent)
 {
     Validator = validator;
     Parent    = parent;
 }
Beispiel #5
0
        private static IEnumerable <string> GenerateExtension(SourceDefinition source, ExtensionPathNode node)
        {
            if (!node.Extensions.Any())
            {
                return(Enumerable.Empty <string>());
            }

            var nodes = new List <ExtensionPathNode>();

            var current = node;

            while (current != null)
            {
                nodes.Insert(0, current);
                current = current.Parent;
            }

            switch (nodes.Count)
            {
            case 1:
                return(nodes[0]
                       .Extensions
                       .SelectMany(extension => ExtensionGenerator.GenerateExtensionOne(source, node.DataType.Match(Option.Some, () => extension.DataType), extension)));

            case 2:
                return(nodes[1]
                       .Extensions
                       .SelectMany(extension => ExtensionGenerator.GenerateExtensionTwo(source, node.DataType.Match(Option.Some, () => extension.DataType), nodes[1].Validator, extension))
                       .Concat(ExtensionGenerator.GenerateInvertExtensionTwo(source, node.DataType, nodes[1].Validator)));

            case 3:
                return(nodes[2]
                       .Extensions
                       .SelectMany(extension => ExtensionGenerator.GenerateExtensionThree(source, node.DataType.Match(Option.Some, () => extension.DataType), nodes[1].Validator, nodes[2].Validator, extension))
                       .Concat(ExtensionGenerator.GenerateInvertExtensionThree(source, node.DataType, nodes[1].Validator, nodes[2].Validator)));

            default:
                throw new Exception("Extensions of this length are not supported.");
            }
        }
Beispiel #6
0
 private static IEnumerable <string> GenerateExtensions(SourceDefinition source, ExtensionPathNode node)
 => GenerateExtension(source, node)
 .Concat(node.Children.SelectMany(child => GenerateExtensions(source, child)));