Sha256: 15ce2116128e972d9c6ee7cc28ec3f6e9b0591ea36bdebe5943149974aade23f

Contents?: true

Size: 1.91 KB

Versions: 71

Compression:

Stored size: 1.91 KB

Contents

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Generators.Input;
using Generators.Output;

namespace Generators
{
    public class ExerciseCollection : IEnumerable<Exercise>
    {
        private readonly CanonicalDataFile _canonicalDataFile;
        private readonly Dictionary<string, Type> _exerciseTypesByName;

        public ExerciseCollection(CanonicalDataFile canonicalDataFile)
        {
            _canonicalDataFile = canonicalDataFile;

            _exerciseTypesByName = Assembly.GetEntryAssembly()
                .GetTypes()
                .Where(IsConcreteGenerator)
                .ToDictionary(type => type.ToExerciseName(), StringComparer.OrdinalIgnoreCase);
        }

        public IEnumerator<Exercise> GetEnumerator() => GetExercises().GetEnumerator();

        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();

        private IEnumerable<Exercise> GetExercises()
        {
            foreach (var exerciseName in ConfigFile.GetExerciseNames())
            {
                if (HasNoCanonicalData(exerciseName))
                    yield return new MissingDataExercise(exerciseName);
                else if (IsNotImplemented(exerciseName))
                    yield return new UnimplementedExercise(exerciseName);
                else
                    yield return CreateExercise(exerciseName);
            }
        }

        private bool HasNoCanonicalData(string exerciseName) => !_canonicalDataFile.Exists(exerciseName);

        private bool IsNotImplemented(string exerciseName) => !_exerciseTypesByName.ContainsKey(exerciseName.ToExerciseName());

        private Exercise CreateExercise(string exerciseName) 
            => (Exercise)Activator.CreateInstance(_exerciseTypesByName[exerciseName.ToExerciseName()]);

        private static bool IsConcreteGenerator(Type type) => typeof(Exercise).IsAssignableFrom(type);
    }
}

Version data entries

71 entries across 71 versions & 1 rubygems

Version Path
trackler-2.2.1.136 tracks/csharp/generators/ExerciseCollection.cs
trackler-2.2.1.135 tracks/csharp/generators/ExerciseCollection.cs
trackler-2.2.1.134 tracks/csharp/generators/ExerciseCollection.cs
trackler-2.2.1.133 tracks/csharp/generators/ExerciseCollection.cs
trackler-2.2.1.132 tracks/csharp/generators/ExerciseCollection.cs
trackler-2.2.1.131 tracks/csharp/generators/ExerciseCollection.cs
trackler-2.2.1.130 tracks/csharp/generators/ExerciseCollection.cs
trackler-2.2.1.129 tracks/csharp/generators/ExerciseCollection.cs
trackler-2.2.1.128 tracks/csharp/generators/ExerciseCollection.cs
trackler-2.2.1.127 tracks/csharp/generators/ExerciseCollection.cs
trackler-2.2.1.126 tracks/csharp/generators/ExerciseCollection.cs
trackler-2.2.1.125 tracks/csharp/generators/ExerciseCollection.cs
trackler-2.2.1.124 tracks/csharp/generators/ExerciseCollection.cs
trackler-2.2.1.123 tracks/csharp/generators/ExerciseCollection.cs
trackler-2.2.1.122 tracks/csharp/generators/ExerciseCollection.cs
trackler-2.2.1.121 tracks/csharp/generators/ExerciseCollection.cs
trackler-2.2.1.120 tracks/csharp/generators/ExerciseCollection.cs
trackler-2.2.1.119 tracks/csharp/generators/ExerciseCollection.cs
trackler-2.2.1.118 tracks/csharp/generators/ExerciseCollection.cs
trackler-2.2.1.117 tracks/csharp/generators/ExerciseCollection.cs