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

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