index.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. var Individual = require('individual')
  2. var VERSION_KEY = '1';
  3. var ERROR_CACHE_KEY = '__RUST_RESULT_ERROR_UUID@' + VERSION_KEY
  4. var OK_CACHE_KEY = '__RUST_RESULT_OK_UUID@' + VERSION_KEY
  5. var ERROR_UUID = Individual(ERROR_CACHE_KEY, fakeUUID('Error'))
  6. var OK_UUID = Individual(OK_CACHE_KEY, fakeUUID('Ok'))
  7. function Ok(v) {
  8. this.v = v
  9. this[OK_UUID] = true
  10. }
  11. function Err(err) {
  12. this.err = err
  13. this[ERROR_UUID] = true
  14. }
  15. function createOk(v) {
  16. if (isObject(v) && OK_UUID in v) {
  17. return v.v
  18. } else if (isObject(v) && ERROR_UUID in v) {
  19. return undefined
  20. } else {
  21. if (v === undefined) {
  22. throw Error('rust-result: Cannot box `undefined` in Result.Ok')
  23. }
  24. return new Ok(v)
  25. }
  26. }
  27. function createErr(err) {
  28. if (isObject(err) && ERROR_UUID in err) {
  29. return err.err
  30. } else if (isObject(err) && OK_UUID in err) {
  31. return undefined
  32. } else {
  33. if (!isError(err)) {
  34. throw Error('rust-result: Cannot box a non-error in Result.Err')
  35. }
  36. return new Err(err)
  37. }
  38. }
  39. function isOk(v) {
  40. return createOk(v) !== undefined
  41. }
  42. function isErr(err) {
  43. return createErr(err) !== undefined
  44. }
  45. module.exports = {
  46. isOk: isOk,
  47. Ok: createOk,
  48. isErr: isErr,
  49. Err: createErr
  50. }
  51. function fakeUUID(word) {
  52. return 'rust-result:' + word + ':' +
  53. Math.random().toString(32).slice(2) + ':' +
  54. Math.random().toString(32).slice(2) + ':' +
  55. Math.random().toString(32).slice(2) + ':' +
  56. Math.random().toString(32).slice(2) + ':'
  57. }
  58. function isObject(o) {
  59. return typeof o === 'object' && o !== null
  60. }
  61. function isError(e) {
  62. return isObject(e) &&
  63. (Object.prototype.toString.call(e) === '[object Error]' ||
  64. /* istanbul ignore next */ e instanceof Error)
  65. }