Beispiel #1
0
    /// <inheritdoc />
    protected override async Task OnProcessAsync(CancellationToken cancellationToken = default)
    {
        await RunAsync(null, cancellationToken);

        var s       = Arguments.Verb?.TryGet(0);
        var console = GetConsole();

        if (s == "period" || s == "p" || s == "周期" || (s == "Period" && Arguments.Verb.Count > 1))
        {
            s = Arguments.Verb.TryGet(1);
            if (string.IsNullOrEmpty(s))
            {
                ChemistryCommandLine.WriteTable(GetConsole(), ChemicalElementStyle);
            }
            else if (int.TryParse(s, out var period) && period > 0)
            {
                if (period > 7)
                {
                    var start = ChemicalElement.FirstAtomicNumberInPeriod(period);
                    var end   = ChemicalElement.LastAtomicNumberInPeriod(period);
                    if (start <= 0 || end <= 0 || start >= end)
                    {
                        WriteError(" The period was too large.");
                    }
                    else
                    {
                        console.WriteLine(ChemistryResource.ChemicalElement);
                        console.WriteLine($"{start} - {end} (Total {end - start + 1})");
                    }

                    return;
                }

                var elements = ChemicalElement.GetExisted();
                var has      = false;
                foreach (var element in elements)
                {
                    if (element is null)
                    {
                        continue;
                    }
                    if (element.Period != period)
                    {
                        if (has)
                        {
                            break;
                        }
                        continue;
                    }

                    WriteSimpleInfo(element, Arguments.Has("en"));
                }
            }
            else if (s.Equals("help", StringComparison.OrdinalIgnoreCase) || s.Equals("?", StringComparison.Ordinal))
            {
                WriteHelp(Arguments.Verb?.Key, "period");
            }
            else
            {
                WriteError(" The period should be a natural number.");
            }

            return;
        }

        var q = Arguments.GetMergedValue("q")?.Trim();

        if (q.Length < 1)
        {
            q = null;
        }

        if (s == "*" || s == "all" || s == "a")
        {
            foreach (var i in ChemicalElement.Where(GetFilter(q)))
            {
                WriteSimpleInfo(i, Arguments.Has("en"));
            }

            return;
        }

        if (s == "ls" || s == "l" || s == "list" || s == "dir" || s == "全部")
        {
            var filter = Arguments.Verb.TryGet(1)?.Trim()?.Split('-');
            List <ChemicalElement> col = null;
            if (filter is null || filter.Length < 1 || string.IsNullOrWhiteSpace(filter[0]))
            {
            }
            else if (filter[0].Equals("help", StringComparison.OrdinalIgnoreCase) || filter[0].Equals("?", StringComparison.Ordinal))
            {
                WriteHelp(Arguments.Verb?.Key, "ls");
                return;
            }
            else if (!int.TryParse(filter[0], out var begin))
            {
            }
            else if (filter.Length == 1)
            {
                col = ChemicalElement.Range(0, begin).ToList();
            }
            else if (filter.Length == 2 && int.TryParse(filter[1], out var end))
            {
                col = ChemicalElement.Range(begin, end - begin).ToList();
            }

            if (col is null)
            {
                col = ChemicalElement.Where(null).ToList();
            }
            var filter2 = GetFilter(q);
            foreach (var i in filter2 is null ? col : col.Where(filter2))
            {
                WriteSimpleInfo(i, Arguments.Has("en"));
            }

            return;
        }