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.2 kB

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