36 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			36 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| /*
 | |
|  * Copyright (C) SapphireCode - All Rights Reserved
 | |
|  * This file is part of Snippeteer which is released under BSD-3-Clause.
 | |
|  * See file 'LICENSE' for full license details.
 | |
|  * Created by Timo Hocker <timo@scode.ovh>, June 2020
 | |
|  */
 | |
| 
 | |
| import { StringOption } from '@sapphirecode/console-app';
 | |
| 
 | |
| export class Menu {
 | |
|   private _options: Record<string, ()=>void|Promise<void>> = {};
 | |
|   private _title: string;
 | |
| 
 | |
|   public constructor (title: string) {
 | |
|     this._title = title;
 | |
|   }
 | |
| 
 | |
|   public async run (): Promise<void> {
 | |
|     const options = Object.keys (this._options);
 | |
|     const selected = await (new StringOption ({
 | |
|       name:              'menu_select',
 | |
|       message:           this._title,
 | |
|       sources:           { console: false },
 | |
|       exit_on_interrupt: true,
 | |
|       preset:            options
 | |
|     }))
 | |
|       .parse ();
 | |
|     if (typeof this._options[selected] !== 'undefined')
 | |
|       await new Promise (this._options[selected]);
 | |
|   }
 | |
| 
 | |
|   public register_option (name:string, callback:()=>void|Promise<void>): void {
 | |
|     this._options[name] = callback;
 | |
|   }
 | |
| }
 |