package UQMI; use v5.24; use warnings; use IO::Async::Function; use JSON::MaybeXS; use Capture::Tiny qw/capture/; use Future; my $device = '/dev/cdc-wdm0'; my $function = IO::Async::Function->new( code => \&_command, max_workers => 5, min_workers => 1, idle_timeout => 5, exit_on_die => 1, ); sub init {$_[0]->add($function)} sub set_device {$device = $_[0] // $device;} sub _command { my ($is_json, @args) = @_; print "Running /sbin/uqmi -d $device ", join(' ', @args), "\n"; my ($stdout, $stderr) = capture {system('/sbin/uqmi', '-d', $device, @args)}; if ($stderr) { warn "Got error from uqmi: $stderr"; } if ($is_json) { my $data = decode_json $stdout; return $data; } else { return $stdout; } } sub _call_json { my $fut = $function->call(args => [1, @_]); return $fut; } sub _call_plain { my $fut = $function->call(args => [0, @_]); return $fut; } sub _sms_list { my $fut = _call_json(qw/--list-messages/); return $fut; } sub get_sms_count { my $list = _sms_list->get(); return scalar $list->@*; } sub peek_sms { my $message_list = _sms_list()->get(); if ($message_list->@*) { my $mid = pop $message_list->@*; return get_message($mid); } else { return Future->done(); } } sub get_message { my $mid = shift; my $fut = _call_json(qw/--get-message/, $mid); return $fut; } sub pop_sms { my $message_list = _sms_list()->get(); if ($message_list->@*) { my $mid = pop $message_list->@*; my $fut = get_message($mid); return $fut->then(sub { my $data = shift; say "Got message data ".$data; _call_plain(qw/--delete-message/, $mid)->get(); return Future->done($data); }); } else { return Future->done(); } } sub send_sms { my ($to, $contents) = @_; return _call_plain(qw/--send-message/, $contents, qw/--send-message-target/, $to)->on_ready(sub {say "Message sent"}); } 1;