๐Ÿ“ฆ techouse / alfred-emoji

๐Ÿ“„ main.dart ยท 99 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99import 'dart:io' show File, exitCode, stdout;

import 'package:alfred_workflow/alfred_workflow.dart';
import 'package:algoliasearch/src/model/hit.dart';
import 'package:algoliasearch/src/model/search_response.dart';
import 'package:args/args.dart';
import 'package:cli_script/cli_script.dart';
import 'package:stash/stash_api.dart';

import 'src/env/env.dart';
import 'src/extensions/string_helpers.dart';
import 'src/models/fitzpatrick.dart';
import 'src/models/search_result.dart';
import 'src/services/algolia_search.dart';
import 'src/services/emoji_downloader.dart';

part 'main_helpers.dart';

bool _verbose = false;
bool _update = false;

void main(List<String> arguments) {
  wrapMain(() async {
    try {
      exitCode = 0;

      _workflow.clearItems();

      final ArgParser parser = ArgParser()
        ..addOption('query', abbr: 'q', defaultsTo: '')
        ..addFlag('verbose', abbr: 'v', defaultsTo: false)
        ..addFlag('update', abbr: 'u', defaultsTo: false);
      final ArgResults args = parser.parse(arguments);

      _update = args['update'];
      if (_update) {
        stdout.writeln('Updating workflow...');

        return await _updater.update();
      }

      _verbose = args['verbose'];

      final String query =
          args['query'].replaceAll(RegExp(r'\s+'), ' ').trim().toLowerCase();

      final Map<String, AlfredUserConfiguration<AlfredUserConfigurationConfig>>?
          userDefaults = await _workflow.getUserDefaults();
      final int? toneIndex = int.tryParse(
        userDefaults?['alfred_emoji_skin_tone']?.config.value as String? ?? '',
      );
      late final Fitzpatrick? tone;

      if (toneIndex != null && toneIndex >= 1 && toneIndex <= 5) {
        try {
          tone = Fitzpatrick.values.elementAt(toneIndex - 1);
        } on RangeError {
          tone = null;
        }
      } else {
        tone = null;
      }

      if (_verbose) {
        stdout.writeln('Query: "$query"');
        if (tone != null) stdout.writeln('Tone: $tone');
      }

      if (query.isEmpty) {
        _showPlaceholder();
      } else {
        _workflow.cacheKey =
            tone != null ? '$query-$tone'.md5hex : query.md5hex;
        if (await _workflow.getItems() == null) {
          await _performSearch(
            query.toLowerCase(),
            tone: tone,
          );
        }
      }
    } on FormatException catch (err) {
      exitCode = 2;
      _workflow.addItem(AlfredItem(title: err.toString()));
    } catch (err) {
      exitCode = 1;
      _workflow.addItem(AlfredItem(title: err.toString()));
      if (_verbose) rethrow;
    } finally {
      if (!_update) {
        if (await _updater.updateAvailable()) {
          _workflow.run(addToBeginning: updateItem);
        } else {
          _workflow.run();
        }
      }
    }
  });
}