You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
1.7 KiB
81 lines
1.7 KiB
var Individual = require('individual') |
|
|
|
var VERSION_KEY = '1'; |
|
var ERROR_CACHE_KEY = '__RUST_RESULT_ERROR_UUID@' + VERSION_KEY |
|
var OK_CACHE_KEY = '__RUST_RESULT_OK_UUID@' + VERSION_KEY |
|
|
|
var ERROR_UUID = Individual(ERROR_CACHE_KEY, fakeUUID('Error')) |
|
var OK_UUID = Individual(OK_CACHE_KEY, fakeUUID('Ok')) |
|
|
|
function Ok(v) { |
|
this.v = v |
|
|
|
this[OK_UUID] = true |
|
} |
|
|
|
function Err(err) { |
|
this.err = err |
|
|
|
this[ERROR_UUID] = true |
|
} |
|
|
|
function createOk(v) { |
|
if (isObject(v) && OK_UUID in v) { |
|
return v.v |
|
} else if (isObject(v) && ERROR_UUID in v) { |
|
return undefined |
|
} else { |
|
if (v === undefined) { |
|
throw Error('rust-result: Cannot box `undefined` in Result.Ok') |
|
} |
|
|
|
return new Ok(v) |
|
} |
|
} |
|
|
|
function createErr(err) { |
|
if (isObject(err) && ERROR_UUID in err) { |
|
return err.err |
|
} else if (isObject(err) && OK_UUID in err) { |
|
return undefined |
|
} else { |
|
if (!isError(err)) { |
|
throw Error('rust-result: Cannot box a non-error in Result.Err') |
|
} |
|
|
|
return new Err(err) |
|
} |
|
} |
|
|
|
function isOk(v) { |
|
return createOk(v) !== undefined |
|
} |
|
|
|
function isErr(err) { |
|
return createErr(err) !== undefined |
|
} |
|
|
|
module.exports = { |
|
isOk: isOk, |
|
Ok: createOk, |
|
isErr: isErr, |
|
Err: createErr |
|
} |
|
|
|
function fakeUUID(word) { |
|
return 'rust-result:' + word + ':' + |
|
Math.random().toString(32).slice(2) + ':' + |
|
Math.random().toString(32).slice(2) + ':' + |
|
Math.random().toString(32).slice(2) + ':' + |
|
Math.random().toString(32).slice(2) + ':' |
|
} |
|
|
|
function isObject(o) { |
|
return typeof o === 'object' && o !== null |
|
} |
|
|
|
function isError(e) { |
|
return isObject(e) && |
|
(Object.prototype.toString.call(e) === '[object Error]' || |
|
/* istanbul ignore next */ e instanceof Error) |
|
}
|
|
|