// Copyright (C) 2022 WYATT GROUP // Please see the AUTHORS file for details. // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . import 'dart:io'; import 'dart:math'; import 'package:wyatt_cli_toolbox/wyatt_cli_toolbox.dart'; void testStylish() { print('my beautiful text in magenta'.magenta()); print('you can combine multiple styles'.yellow().bgBlue().bold()); print('\x1B[36mstart style'); print('style continues on this line'); print('but not on this line'.reset()); print('\x1B[41mnot stripped\x1B[49m'); print('\x1B[41mstripped\x1B[49m'.strip()); Stylish.config(enable: false); print('you can disable extension'.fg(r: 20, g: 160, b: 80)); Stylish.config(enable: true); print('and reenable it on the fly'.fg(r: 20, g: 160, b: 80)); print('custom bg color'.bg(r: 80, g: 110, b: 30)); } void testSequences() { Sequences.clearEntireScreen(); print('Clear entire screen'); print('Hide cursor'); Sequences.hideCursor(); sleep(Duration(seconds: 1)); print('Unhide cursor'); Sequences.unhideCursor(); sleep(Duration(seconds: 1)); print('Save cursor position'); Sequences.savePosition(); sleep(Duration(seconds: 1)); print('Move cursor'); Sequences.moveCursor(6, 3); sleep(Duration(seconds: 1)); Sequences.restorePosition(); Sequences.moveDown(1); sleep(Duration(seconds: 1)); print('Restore cursor position'); } Future testSpinners() async { print('Starting computation 1...'); await Spinner.start(SpinnerType.fistBump); sleep(Duration(seconds: 2)); Spinner.stop(); print('Starting computation 2...'); await Spinner.start(SpinnerType.dots5, text: 'Loading...'); sleep(Duration(seconds: 3)); Spinner.stop(); print('Starting computation 3...'); await Spinner.custom( Indicator( name: 'Eyes', interval: 100, frames: ['◡◡', '⊙⊙', '◠◠'] .map((String e) => '\x1B[36m$e\x1B[39m') .toList(), label: 'Computing...', ), ); await Future.delayed(Duration(seconds: 2)); Spinner.stop(); print('Starting computation 4...'); await Spinner.start(SpinnerType.pipe, text: 'Linking...'); sleep(Duration(seconds: 3)); Spinner.update( SpinnerType.circle.indicator.copyWith(label: 'Compiling...'), ); sleep(Duration(seconds: 3)); Spinner.stop(); } void testPrompt() { final Prompt pr = Prompt(); final StringQuestion q1 = StringQuestion( "What's your name ?", identifier: 'name', ); final PasswordQuestion q8 = PasswordQuestion( 'Password ?', comment: 'Secret shhht.', identifier: 'password', ); final NumberQuestion q7 = NumberQuestion( 'How old are you?', identifier: 'age', ); final BooleanQuestion q2 = BooleanQuestion( 'Do you like Dart ?', identifier: 'dart', ); final ListQuestion q3 = ListQuestion( 'Which target ?', ['android', 'ios', 'windows', 'macos'], identifier: 'platform', ); final Message q4 = Message( 'Oh oh !', level: MessageLevel.warn, identifier: 'warn', ); final Message q5 = Message( 'Oh damn :(', level: MessageLevel.fail, identifier: 'error', ); final Message q6 = Message( 'Thank you, bye! 🤙', comment: 'Pretty comment nah?', identifier: 'bye', ); pr ..addAll(>[q1, q8, q7, q2, q3, q4, q5, q6]) ..ask(); } Future testWorkflow() async { final Task t1 = Task( name: 'Analyzing', id: 'analyze', spinner: SpinnerType.circle, task: () { return waitFor( Future.delayed(Duration(seconds: 3), () => 13), ); }, onFinish: (Object? i) { return '$i files analyzed'; }, ); final Task t2 = Task( name: 'Formatting', id: 'format', spinner: SpinnerType.circle, task: () { return waitFor( Future.delayed(Duration(seconds: 4), () => 1287), ); }, onFinish: (Object? i) { return '$i files modified'; }, ); final Task t3 = Task( name: 'Building', id: 'build', task: () { final List _tasks = [ 'main.c', 'crypto.c', 'workflow.c', 'wyatt.c', 'logger.c', 'task.c', ]; for (final String i in _tasks) { Task.print(i); sleep(Duration(seconds: Random().nextInt(4) + 1)); } }, onFinish: (_) { return 'Compilation success'; }, ); final Task t4 = Task( name: 'Testing', id: 'test', task: () { final List _tasks = [ 'wyatt.h', 'crypto.h', ]; for (final String i in _tasks) { Task.print(i); sleep(Duration(seconds: Random().nextInt(3))); } throw Exception('An error occured during ${'test::crypto.h'.red()}'); }, onFinish: (_) { return 'All tests passed'; }, onError: (Object e) { return e.toString(); }, ); final Task t5 = Task( name: 'Bundling', id: 'bundle', task: () { sleep(Duration(seconds: 3)); throw SkipException('Bundle skipped.'); }, onFinish: (_) { return 'Files generated in dist/'; }, onSkip: (SkipException e) { return e.toString(); }, ); final Workflow w = await Workflow.create(>[t1, t2, t3, t4, t5]); w.start(); print('\n${w.results.toString().dim()}'); } void testNewPrompt() { final name = Input(message: 'Your name').prompt(); stdout.writeln(name); final email = Input( message: 'Your email', validator: (String x) { if (x.contains('@')) { return true; } else { throw ValidationError('Not a valid email'); } }, ).prompt(); stdout.writeln(email); final planet = Input( message: 'Your planet', defaultValue: 'Earth', ).prompt(); stdout.writeln(planet); final galaxy = Input( message: 'Your galaxy', initialValue: 'Andromeda', ).prompt(); stdout.writeln(galaxy); } Future main() async { // sleep(Duration(seconds: 2)); // testPrompt(); // await testWorkflow(); // testStylish(); // testSequences(); // await testSpinners(); // testPrompt(); testNewPrompt(); }