AcManager.Controls.ViewModels.RaceGridViewModel.FindCandidates C# (CSharp) Method

FindCandidates() private method

private FindCandidates ( CancellationToken cancellation = default(CancellationToken) ) : Task>
cancellation System.Threading.CancellationToken
return Task>
        private async Task<IReadOnlyList<RaceGridEntry>> FindCandidates(CancellationToken cancellation = default(CancellationToken)) {
            var mode = Mode;

            // Don’t change anything in Fixed or Manual mode
            if (mode == BuiltInGridMode.Custom || mode == BuiltInGridMode.CandidatesManual) {
                return null;
            }

            // Basic mode, just one car
            if (mode == BuiltInGridMode.SameCar) {
                return _playerCar == null ? new RaceGridEntry[0] : new[] { new RaceGridEntry(_playerCar) };
            }

            // Other modes require cars list to be loaded
            if (!CarsManager.Instance.IsLoaded) {
                await CarsManager.Instance.EnsureLoadedAsync();
            }

            // Another simple mode
            if (mode == BuiltInGridMode.CandidatesFiltered) {
                return CarsManager.Instance.EnabledOnly.Select(x => new RaceGridEntry(x)).ToArray();
            }

            // Same group mode
            if (mode == BuiltInGridMode.CandidatesSameGroup) {
                if (_playerCar == null) return new RaceGridEntry[0];

                var parent = _playerCar.Parent ?? _playerCar;
                return parent.Children.Prepend(parent).Where(x => x.Enabled).Select(x => new RaceGridEntry(x)).ToArray();
            }

            // Entry from a JSON-file
            if (mode.AffectedByCar && _playerCar == null || mode.AffectedByTrack && _track == null) {
                return new RaceGridEntry[0];
            }

            var candidatesMode = mode as CandidatesGridMode;
            if (candidatesMode != null) {
                return await Task.Run(() => {
                    var carsEnumerable = (IEnumerable<CarObject>)CarsManager.Instance.EnabledOnly.ToList();

                    if (!string.IsNullOrWhiteSpace(candidatesMode.Filter)) {
                        var filter = StringBasedFilter.Filter.Create(CarObjectTester.Instance, candidatesMode.Filter);
                        carsEnumerable = carsEnumerable.Where(filter.Test);
                    }

                    if (!string.IsNullOrWhiteSpace(candidatesMode.Script)) {
                        var state = LuaHelper.GetExtended();
                        if (state == null) throw new InformativeException(ToolsStrings.Common_LuaFailed);

                        if (mode.AffectedByCar) {
                            state.Globals[@"selected"] = _playerCar;
                        }

                        if (mode.AffectedByTrack) {
                            state.Globals[@"track"] = _track;
                        }

                        var result = state.DoString(PrepareScript(candidatesMode.Script));
                        if (result.Type == DataType.Boolean && !result.Boolean) return new RaceGridEntry[0];

                        var fn = result.Function;
                        if (fn == null) throw new InformativeException(ToolsStrings.RaceGrid_InvalidScriptResult);

                        carsEnumerable = carsEnumerable.Where(x => fn.Call(x).Boolean);
                    }

                    return carsEnumerable.Select(x => new RaceGridEntry(x)).ToArray();
                }, cancellation);
            }

            Logging.Error($"Not supported mode: {mode.Id} ({mode.GetType().Name})");
            return new RaceGridEntry[0];
        }