43 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { Assignable, Serializable } from './interfaces';
 | |
| 
 | |
| export abstract class Persistent implements Assignable, Serializable {
 | |
|   private _data: Record<string, unknown> = {};
 | |
|   protected readonly properties: Record<string, string> = {};
 | |
| 
 | |
|   public assign (a: Assignable): void {
 | |
|     this.assign_object (a.to_object ());
 | |
|   }
 | |
| 
 | |
|   public assign_to (a: Assignable): void {
 | |
|     a.assign (this);
 | |
|   }
 | |
| 
 | |
|   public assign_object (obj: Record<string, unknown>): void {
 | |
|     for (const key of Object.keys (obj)) {
 | |
|       const prop = this.properties[key];
 | |
|       if (typeof prop !== 'undefined' && typeof obj[key] === prop)
 | |
|         this._data[key] = obj[key];
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   public to_object (): Record<string, unknown> {
 | |
|     return this._data;
 | |
|   }
 | |
| 
 | |
|   public serialize (formatted = false): string {
 | |
|     if (formatted)
 | |
|       return JSON.stringify (this.to_object ());
 | |
|     return JSON.stringify (this.to_object (), null, 2);
 | |
|   }
 | |
| 
 | |
|   public set (key: string, value: unknown): void {
 | |
|     const prop = this.properties[key];
 | |
|     if (typeof prop !== 'undefined' && typeof value === prop)
 | |
|       this._data[key] = value;
 | |
|   }
 | |
| 
 | |
|   public get (key: string): unknown {
 | |
|     return this._data[key];
 | |
|   }
 | |
| }
 |