@jondotsoy/flags
Version:
A Javascript arguments processor
86 lines • 6.14 kB
JavaScript
/** Inmutable class */
export class Spec {
#refiners;
#initial;
#accumulate;
#metadata;
constructor(initial, refiners, accumulate, metadata) {
this.#initial = initial;
this.#refiners = refiners;
this.#accumulate = accumulate;
this.#metadata = metadata ?? {};
}
initial(initial) {
return new Spec(initial, this.#refiners, this.#accumulate, this.#metadata);
}
accumulate(accumulate) {
return new Spec(this.#initial, this.#refiners, accumulate, this.#metadata);
}
refine(refine) {
return new Spec(this.#initial, [...this.#refiners, refine], this.#accumulate, this.#metadata);
}
metadata(values) {
return new Spec(this.#initial, this.#refiners, this.#accumulate, {
...this.#metadata,
...values,
});
}
getMetadata(key) {
return this.#metadata[key];
}
hasMetadata(key) {
return key in this.#metadata;
}
copyMetadata() {
return { ...this.#metadata };
}
getInitial() {
return this.#initial;
}
getAccumulate() {
return this.#accumulate;
}
getRefiners() {
return this.#refiners;
}
parse(startIndex, args, prevValue, builder) {
if (args.length === 0 || startIndex >= args.length) {
return null;
}
let context = null;
const arg = args[startIndex];
// Apply each refiner in sequence
for (const refiner of this.#refiners) {
const result = refiner(arg, startIndex, args, context, builder);
if (result === null) {
return null;
}
context = {
args: result.args,
index: startIndex,
value: result.value,
};
}
// If no refiners or all passed, return the final context
if (context) {
// Extract the consumed args from the original args array
const consumedArgs = args.slice(startIndex, startIndex + context.args.length);
// Apply accumulate function if it exists
let finalValue = context.value;
if (this.#accumulate && prevValue) {
// Use prevValue if provided, otherwise use initial value
finalValue = this.#accumulate(prevValue?.current, context.value, startIndex, args);
}
return {
args: consumedArgs,
index: startIndex,
value: finalValue,
};
}
return null;
}
static create() {
return new Spec(null, []);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9idWlsZGVycy9TcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXNCQSxzQkFBc0I7QUFDdEIsTUFBTSxPQUFPLElBQUk7SUFDZixTQUFTLENBQVc7SUFDcEIsUUFBUSxDQUFlO0lBQ3ZCLFdBQVcsQ0FBYztJQUN6QixTQUFTLENBQXNCO0lBRS9CLFlBQ0UsT0FBcUIsRUFDckIsUUFBa0IsRUFDbEIsVUFBdUIsRUFDdkIsUUFBOEI7UUFFOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFDeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7UUFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7UUFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLElBQUksRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxPQUFPLENBQUksT0FBVTtRQUNuQixPQUFPLElBQUksSUFBSSxDQUNiLE9BQU8sRUFDUCxJQUFJLENBQUMsU0FBUyxFQUNkLElBQUksQ0FBQyxXQUFXLEVBQ2hCLElBQUksQ0FBQyxTQUFTLENBQ2YsQ0FBQztJQUNKLENBQUM7SUFFRCxVQUFVLENBQUMsVUFBc0I7UUFDL0IsT0FBTyxJQUFJLElBQUksQ0FDYixJQUFJLENBQUMsUUFBUSxFQUNiLElBQUksQ0FBQyxTQUFTLEVBQ2QsVUFBVSxFQUNWLElBQUksQ0FBQyxTQUFTLENBQ2YsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLENBQUksTUFBYztRQUN0QixPQUFPLElBQUksSUFBSSxDQUNiLElBQUksQ0FBQyxRQUFRLEVBQ2IsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLEVBQzNCLElBQUksQ0FBQyxXQUFXLEVBQ2hCLElBQUksQ0FBQyxTQUFTLENBQ2YsQ0FBQztJQUNKLENBQUM7SUFFRCxRQUFRLENBQUMsTUFBMkI7UUFDbEMsT0FBTyxJQUFJLElB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