274 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			274 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
// 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 <https://www.gnu.org/licenses/>.
 | 
						|
 | 
						|
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<void> 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: <String>['◡◡', '⊙⊙', '◠◠']
 | 
						|
          .map<String>((String e) => '\x1B[36m$e\x1B[39m')
 | 
						|
          .toList(),
 | 
						|
      label: 'Computing...',
 | 
						|
    ),
 | 
						|
  );
 | 
						|
  await Future<void>.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 ?',
 | 
						|
    <String>['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(<Question<dynamic>>[q1, q8, q7, q2, q3, q4, q5, q6])
 | 
						|
    ..ask();
 | 
						|
}
 | 
						|
 | 
						|
Future<void> testWorkflow() async {
 | 
						|
  final Task<int> t1 = Task<int>(
 | 
						|
    name: 'Analyzing',
 | 
						|
    id: 'analyze',
 | 
						|
    spinner: SpinnerType.circle,
 | 
						|
    task: () {
 | 
						|
      return waitFor<int>(
 | 
						|
        Future<int>.delayed(Duration(seconds: 3), () => 13),
 | 
						|
      );
 | 
						|
    },
 | 
						|
    onFinish: (Object? i) {
 | 
						|
      return '$i files analyzed';
 | 
						|
    },
 | 
						|
  );
 | 
						|
  final Task<int> t2 = Task<int>(
 | 
						|
    name: 'Formatting',
 | 
						|
    id: 'format',
 | 
						|
    spinner: SpinnerType.circle,
 | 
						|
    task: () {
 | 
						|
      return waitFor<int>(
 | 
						|
        Future<int>.delayed(Duration(seconds: 4), () => 1287),
 | 
						|
      );
 | 
						|
    },
 | 
						|
    onFinish: (Object? i) {
 | 
						|
      return '$i files modified';
 | 
						|
    },
 | 
						|
  );
 | 
						|
  final Task<void> t3 = Task<void>(
 | 
						|
    name: 'Building',
 | 
						|
    id: 'build',
 | 
						|
    task: () {
 | 
						|
      final List<String> _tasks = <String>[
 | 
						|
        '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<void> t4 = Task<void>(
 | 
						|
    name: 'Testing',
 | 
						|
    id: 'test',
 | 
						|
    task: () {
 | 
						|
      final List<String> _tasks = <String>[
 | 
						|
        '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<void> t5 = Task<void>(
 | 
						|
    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(<Task<dynamic>>[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<void> main() async {
 | 
						|
  // sleep(Duration(seconds: 2));
 | 
						|
  // testPrompt();
 | 
						|
  // await testWorkflow();
 | 
						|
  // testStylish();
 | 
						|
  // testSequences();
 | 
						|
  // await testSpinners();
 | 
						|
  // testPrompt();
 | 
						|
  testNewPrompt();
 | 
						|
}
 |