44 lines
936 B
JavaScript
44 lines
936 B
JavaScript
import { Item_Unresolvable } from '@efforting.tech/errors';
|
|
|
|
export class Abstract_Resolver {
|
|
resolve(item) {
|
|
const handler = this.resolve_handler(item);
|
|
if (!handler) {
|
|
throw new Item_Unresolvable({ resolver: this, item });
|
|
}
|
|
return handler({ resolver: this, item });
|
|
}
|
|
}
|
|
|
|
export class Chained_Resolver extends Abstract_Resolver {
|
|
constructor(chain_links) {
|
|
super();
|
|
Object.assign(this, { chain_links });
|
|
}
|
|
|
|
resolve_handler(item) {
|
|
const { chain_links } = this;
|
|
for (const link of chain_links) {
|
|
const handler = link.resolve_handler(item);
|
|
if (handler) {
|
|
return handler;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
export class Mapping_Resolver extends Abstract_Resolver {
|
|
constructor(rules=new Map(), key_function=null) {
|
|
Object.assign(this, { rules, key_function });
|
|
}
|
|
|
|
resolve_handler(item) {
|
|
const { key_function, rules } = this;
|
|
const key = key_function ? key_function(item) : item;
|
|
return rules.get(key);
|
|
}
|
|
|
|
}
|
|
|