UNPKG

iron-enum

Version:

Rust like enums for Typescript

1 lines 2.95 kB
"use strict";function makeIf(r,e){return function(o,t,n){if(o===r){if(t){const r=null==e?t():t(e);return void 0===r||r}return!0}if(n){const o=n({[r]:e});return void 0!==o&&o}return!1}}function makeIfNot(r,e){return function(o,t,n){if(o!==r){if(t){const o=t({[r]:e});return void 0===o||o}return!0}if(n){const o=n({[r]:e});return void 0!==o&&o}return!1}}function enumFactory(r,e,o){if("_"===e)throw new Error("'_' is reserved as a fallback key.");return{tag:e,data:o,payload:o,toJSON:()=>({[e]:o}),key:()=>e,if:makeIf(e,o),ifNot:makeIfNot(e,o),match:r=>{const t=r[e]??r._;if(!t)throw new Error(`No handler for variant '${String(e)}' and no '_' fallback`);return t(o)},matchAsync:async r=>{const t=r[e]??r._;if(!t)throw new Error(`No handler for variant '${String(e)}' and no '_' fallback`);return t(o)}}}function IronEnum(r){const e=r?.keys,o=r=>{const o=Object.keys(r);if(1!==o.length)throw new Error(`Expected exactly 1 variant key, got ${o.length}`);const t=o[0];if(e?.length&&!e.includes(t))throw new Error(`Unexpected variant '${t}'`);return enumFactory({},t,r[t])};if(e?.length){const r={_:{parse:o}};for(const o of e)r[o]=r=>enumFactory({},o,r);return r}return new Proxy({},{get:(r,e)=>"_"===e?{parse:o}:(...r)=>{const o=0===r.length?{}:r[0];return enumFactory({},e,o)}})}Object.defineProperty(exports,"__esModule",{value:!0}),exports.TryInto=exports.Try=exports.None=exports.Some=exports.Option=exports.Err=exports.Ok=exports.Result=void 0,exports.IronEnum=IronEnum;const Result=()=>{const r=IronEnum();return{_:r._,Ok:e=>({...r.Ok(e),_:{new:r},unwrap:()=>e,unwrap_or:()=>e,unwrap_or_else:()=>e,isOk:()=>!0,isErr:()=>!1,ok:()=>(0,exports.Option)().Some(e)}),Err:e=>({...r.Err(e),_:{new:r},unwrap:()=>{throw e instanceof Error?e:new Error(String(e??"Err"))},unwrap_or:r=>r,unwrap_or_else:r=>r(),isOk:()=>!1,isErr:()=>!0,ok:()=>(0,exports.Option)().None()})}};exports.Result=Result;const Ok=r=>(0,exports.Result)().Ok(r);exports.Ok=Ok;const Err=r=>(0,exports.Result)().Err(r);exports.Err=Err;const Option=()=>{const r=IronEnum();return{_:r._,Some:e=>({...r.Some(e),_:{new:r},isSome:()=>!0,isNone:()=>!1,unwrap:()=>e,unwrap_or:()=>e,unwrap_or_else:()=>e,ok_or:r=>(0,exports.Result)().Ok(e),ok_or_else:r=>(0,exports.Result)().Ok(e)}),None:()=>({...r.None(),_:{new:r},isSome:()=>!1,isNone:()=>!0,unwrap:()=>{throw new Error("Called unwrap() on Option.None")},unwrap_or:r=>r,unwrap_or_else:r=>r(),ok_or:r=>(0,exports.Result)().Err(r),ok_or_else:r=>(0,exports.Result)().Err(r())})}};exports.Option=Option;const Some=r=>(0,exports.Option)().Some(r);exports.Some=Some;const None=()=>(0,exports.Option)().None();exports.None=None,exports.Try={sync(r){try{return(0,exports.Result)().Ok(r())}catch(r){return(0,exports.Result)().Err(r)}},async async(r){try{return(0,exports.Result)().Ok(await r())}catch(r){return(0,exports.Result)().Err(r)}}},exports.TryInto={sync:r=>(...e)=>exports.Try.sync(()=>r(...e)),async:r=>async(...e)=>exports.Try.async(()=>r(...e))};