/// <summary>
        /// Creates a new instance of the <see cref="VisitorCollection"/> class by scanning the current assembly for <see cref="IVisitor"/>.
        /// </summary>
        /// <remarks>
        /// There is an expectation that the <see cref="IVisitor"/> implementation has a constructor that takes a <see cref="VisitorCollection"/> as the only parameter.
        /// </remarks>
        /// <returns>Returns the <see cref="VisitorCollection"/> instance.</returns>
        public static VisitorCollection CreateInstance()
        {
            var collection = new VisitorCollection();

            collection.Visitors = typeof(IVisitor).Assembly
                                  .GetTypes()
                                  .Where(p => p.Name.EndsWith("Visitor") && p.IsClass && !p.IsAbstract)
                                  .Select(p => (IVisitor)Activator.CreateInstance(p, collection)).ToList();          // NOTE: there is no direct enforcement on the constructor arguments of the visitors
            return(collection);
        }
        /// <inheritdoc />
        public void Accept(VisitorCollection collection, NamingStrategy namingStrategy)
        {
            // Checks the properties only.
            if (this.Properties.Any())
            {
                foreach (var property in this.Properties)
                {
                    var attributes = new List <Attribute>
                    {
                        property.Value.GetCustomAttribute <OpenApiSchemaVisibilityAttribute>(inherit: false),
                        property.Value.GetCustomAttribute <OpenApiPropertyAttribute>(inherit: false),
                    };
                    attributes.AddRange(property.Value.GetCustomAttributes <ValidationAttribute>(inherit: false));

                    foreach (var visitor in collection.Visitors)
                    {
                        if (!visitor.IsVisitable(property.Value.PropertyType))
                        {
                            continue;
                        }

                        var type = new KeyValuePair <string, Type>(property.Key, property.Value.PropertyType);
                        visitor.Visit(this, type, namingStrategy, attributes.ToArray());
                    }
                }

                return;
            }

            // Checks the types only.
            foreach (var type in this.Types)
            {
                foreach (var visitor in collection.Visitors)
                {
                    if (!visitor.IsVisitable(type.Value))
                    {
                        continue;
                    }

                    visitor.Visit(this, type, namingStrategy);
                }
            }
        }
 /// <inheritdoc />
 public DateTimeObjectTypeVisitor(VisitorCollection visitorCollection)
     : base(visitorCollection)
 {
 }
Ejemplo n.º 4
0
 /// <summary>
 /// Initializes a new instance of the <see cref="TypeVisitor"/> class.
 /// </summary>
 /// <param name="visitorCollection"><see cref="VisitorCollection"/> instance.</param>
 protected TypeVisitor(VisitorCollection visitorCollection)
 {
     this.VisitorCollection = visitorCollection.ThrowIfNullOrDefault();
 }
Ejemplo n.º 5
0
 /// <inheritdoc />
 public ByteArrayTypeVisitor(VisitorCollection visitorCollection)
     : base(visitorCollection)
 {
 }
Ejemplo n.º 6
0
 /// <inheritdoc />
 public ByteEnumTypeVisitor(VisitorCollection visitorCollection)
     : base(visitorCollection)
 {
 }
 /// <inheritdoc />
 public SingleTypeVisitor(VisitorCollection visitorCollection)
     : base(visitorCollection)
 {
 }
Ejemplo n.º 8
0
 /// <inheritdoc />
 public Int64TypeVisitor(VisitorCollection visitorCollection)
     : base(visitorCollection)
 {
 }
Ejemplo n.º 9
0
 /// <inheritdoc />
 public Int16EnumTypeVisitor(VisitorCollection visitorCollection)
     : base(visitorCollection)
 {
 }
 /// <inheritdoc />
 public StringTypeVisitor(VisitorCollection visitorCollection)
     : base(visitorCollection)
 {
 }
 /// <inheritdoc />
 public DoubleTypeVisitor(VisitorCollection visitorCollection)
     : base(visitorCollection)
 {
 }
 /// <inheritdoc />
 public BooleanTypeVisitor(VisitorCollection visitorCollection)
     : base(visitorCollection)
 {
 }
Ejemplo n.º 13
0
 /// <inheritdoc />
 public RecursiveObjectTypeVisitor(VisitorCollection visitorCollection)
     : base(visitorCollection)
 {
 }
 /// <inheritdoc />
 public UInt16TypeVisitor(VisitorCollection visitorCollection)
     : base(visitorCollection)
 {
 }
 /// <inheritdoc />
 public NullableObjectTypeVisitor(VisitorCollection visitorCollection)
     : base(visitorCollection)
 {
 }
 /// <inheritdoc />
 public UriTypeVisitor(VisitorCollection visitorCollection)
     : base(visitorCollection)
 {
 }
Ejemplo n.º 17
0
 /// <inheritdoc />
 public DecimalTypeVisitor(VisitorCollection visitorCollection)
     : base(visitorCollection)
 {
 }
Ejemplo n.º 18
0
 /// <inheritdoc />
 public ObjectTypeVisitor(VisitorCollection visitorCollection)
     : base(visitorCollection)
 {
 }
 /// <inheritdoc />
 public ExceptionTypeVisitor(VisitorCollection visitorCollection)
     : base(visitorCollection)
 {
 }