You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

ParseResult.cs 3.0 kB

7 years ago
7 years ago
7 years ago
9 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Linq;
  5. namespace Discord.Commands
  6. {
  7. [DebuggerDisplay(@"{" + nameof(DebuggerDisplay) + @",nq}")]
  8. public struct ParseResult : IResult
  9. {
  10. public IReadOnlyList<TypeReaderResult> ArgValues { get; }
  11. public IReadOnlyList<TypeReaderResult> ParamValues { get; }
  12. public CommandError? Error { get; }
  13. public string ErrorReason { get; }
  14. public bool IsSuccess => !Error.HasValue;
  15. private ParseResult(IReadOnlyList<TypeReaderResult> argValues, IReadOnlyList<TypeReaderResult> paramValues,
  16. CommandError? error, string errorReason)
  17. {
  18. ArgValues = argValues;
  19. ParamValues = paramValues;
  20. Error = error;
  21. ErrorReason = errorReason;
  22. }
  23. public static ParseResult FromSuccess(IReadOnlyList<TypeReaderResult> argValues,
  24. IReadOnlyList<TypeReaderResult> paramValues)
  25. {
  26. if (argValues.Any(t => t.Values.Count > 1))
  27. {
  28. return new ParseResult(argValues, paramValues, CommandError.MultipleMatches,
  29. "Multiple matches found.");
  30. }
  31. if (paramValues.Any(t => t.Values.Count > 1))
  32. {
  33. return new ParseResult(argValues, paramValues, CommandError.MultipleMatches,
  34. "Multiple matches found.");
  35. }
  36. return new ParseResult(argValues, paramValues, null, null);
  37. }
  38. public static ParseResult FromSuccess(IReadOnlyList<TypeReaderValue> argValues,
  39. IReadOnlyList<TypeReaderValue> paramValues)
  40. {
  41. var argList = new TypeReaderResult[argValues.Count];
  42. for (var i = 0; i < argValues.Count; i++)
  43. argList[i] = TypeReaderResult.FromSuccess(argValues[i]);
  44. TypeReaderResult[] paramList;
  45. if (paramValues == null) return new ParseResult(argList, null, null, null);
  46. {
  47. paramList = new TypeReaderResult[paramValues.Count];
  48. for (var i = 0; i < paramValues.Count; i++)
  49. paramList[i] = TypeReaderResult.FromSuccess(paramValues[i]);
  50. }
  51. return new ParseResult(argList, paramList, null, null);
  52. }
  53. public static ParseResult FromError(CommandError error, string reason)
  54. => new ParseResult(null, null, error, reason);
  55. public static ParseResult FromError(Exception ex)
  56. => FromError(CommandError.Exception, ex.Message);
  57. public static ParseResult FromError(IResult result)
  58. => new ParseResult(null, null, result.Error, result.ErrorReason);
  59. public override string ToString() => IsSuccess ? "Success" : $"{Error}: {ErrorReason}";
  60. private string DebuggerDisplay => IsSuccess
  61. ? $"Success ({ArgValues.Count}{(ParamValues.Count > 0 ? $" +{ParamValues.Count} Values" : "")})"
  62. : $"{Error}: {ErrorReason}";
  63. }
  64. }