lib-utils-ts
Version:
<img src="https://img.shields.io/npm/v/lib-utils-ts"/> <img src="https://img.shields.io/snyk/vulnerabilities/npm/lib-utils-ts"/> <img src="https://img.shields.io/npm/l/lib-utils-ts"/> <img src="https://img.shields.io/github/languages/top/devGnode/lib-util
139 lines (108 loc) • 4.29 kB
text/typescript
import {Func, supplierFn,supplier} from "../Interface";
import {Supplier} from "../utils/Supplier";
import {AbstractDecorator} from "./AbstractDecorator";
import {affectFn, AttributeProperties, DecoratorSink, propertiesDescriptor} from "./DecoratorInterfaces";
export class DecoratorAttributes<T> extends AbstractDecorator<T> implements AttributeProperties<T>{
protected decorator: string;
prop:propertiesDescriptor<T>;
constructor(prop:propertiesDescriptor<T> = null ) {super();}
setEnumerable(state:boolean):AttributeProperties<T>{
let slf:this = this;
return new class extends DecoratorBuilderStateOp<T>{
constructor() {super(slf);}
/***@Override**/
public affect:affectFn = ()=>{
slf.get().enumerable = state;
slf.affect();
}
}
}
setWrite(state:boolean):AttributeProperties<T>{
let slf:this = this;
return new class extends DecoratorBuilderStateOp<T>{
constructor() {super(slf);}
/***@Override**/
public affect:affectFn = ()=>{
slf.affect();
slf.get().writable = state;
}
}
}
setConfigurable(state:boolean):AttributeProperties<T>{
let slf:this = this;
return new class extends DecoratorBuilderStateOp<T>{
constructor() {super(slf);}
/***@Override**/
public affect:affectFn = ()=>{
slf.affect();
slf.get().configurable = state;
}
}
}
setValue(value:T):AttributeProperties<T>{
let slf:this = this;
return new class extends DecoratorBuilderStateOp<T>{
constructor() {super(slf);}
/***@Override**/
public affect:affectFn = ()=>{
slf.affect();
slf.get().value = value;
}
}
}
setMethod(value:Function):AttributeProperties<T>{
let slf:this = this;
return new class extends DecoratorBuilderStateOp<T>{
constructor() {super(slf);}
/***@Override**/
public affect:affectFn = ()=>{
slf.affect();
(<any>slf.get()).value = function(...args:Object[]):T{
args.push(slf.getName());
return value.apply(this,args);
};
}
}
}
propertyName(consumer:Func<string, string>):AttributeProperties<T>{
let slf:this = this;
return new class extends DecoratorBuilderStateOp<T>{
constructor() {super(slf);}
/***@Override**/
public affect:affectFn = ()=>{
slf.affect();
let t:this= this;
this.setProperty(new class extends Supplier<string>{
get:supplierFn<string> = ():string=> consumer.call(null,t.getName());
});
}
}
}
readOnly():AttributeProperties<T>{ return this.setConfigurable(false).setWrite(false); }
final():AttributeProperties<T>{ return this.setConfigurable(false).setWrite(false); }
getSink():DecoratorSink<T>{ return <DecoratorSink<T>>this; }
/***@ts-ignore*/
setDecorator(decorator:string):AttributeProperties<T>{ this.decorator = decorator; return this; }
/***
*
*/
public static empty<T>():AttributeProperties<T>{return new DecoratorAttributes(null);}
}
/****
*
*/
class DecoratorBuilderStateOp<T> extends DecoratorAttributes<T>{
private readonly up: DecoratorAttributes<T>;
constructor(up: DecoratorAttributes<T>) {
super(up.prop);
this.up = up;
}
get():propertiesDescriptor<T> {return this.up.get();}
setProp(prop: propertiesDescriptor<T>): void { this.up.setProp(prop);}
setName(value: string): void {this.up.setName(value);}
getName(): string {return this.up.getName();}
getPropertyKey(): string {return this.up.getPropertyKey();}
setProperty(supplier: supplier<string>): void {this.up.setProperty(supplier);}
setDecorator(decorator: string): AttributeProperties<T> {this.up.setDecorator(decorator);return this;}
getDecorator(): string { return this.up.getDecorator();}
}