towers are constructable
[scpubgit/Clifton.git] / lib / App / Clifton / Launcher.pm
1 package App::Clifton::Launcher;
2
3 use IO::Async::Loop;
4 use Log::Contextual qw(set_logger :log);
5 use Log::Contextual::SimpleLogger;
6 use aliased 'App::Clifton::Server';
7 use Moo;
8
9 has config_file => (is => 'ro', required => 1);
10
11 sub run {
12   my ($self) = @_;
13   set_logger(Log::Contextual::SimpleLogger->new({ levels => [ qw(
14     info warn debug error
15   ) ] }));
16   my $loop = IO::Async::Loop->new;
17   my $server = Server->new(
18     config_file => $self->config_file,
19     loop => $loop,
20   );
21   $loop->later(sub {
22     $server->reload_config->on_finished(sub {
23       log_info { "Server startup complete" };
24     });
25   });
26   while (1) {
27     local $@;
28     last if eval { $loop->loop_forever; 1 };
29     my $error = $@;
30     log_error { "Server exception: ${error}" };
31   }
32   log_info { "Server shut down cleanly" };
33 }
34
35 1;