File Coverage

blib/lib/Net/Async/MCP/Server/Transport/Stdio.pm
Criterion Covered Total %
statement 15 41 36.5
branch 0 10 0.0
condition 0 3 0.0
subroutine 5 10 50.0
pod 4 4 100.0
total 24 68 35.2


line stmt bran cond sub pod time code
1             package Net::Async::MCP::Server::Transport::Stdio;
2             # ABSTRACT: Stdio transport for Net::Async::MCP::Server
3              
4 1     1   8029 use strict;
  1         2  
  1         33  
5 1     1   4 use warnings;
  1         1  
  1         44  
6              
7 1     1   4 use parent 'IO::Async::Notifier';
  1         1  
  1         7  
8              
9 1     1   56 use Future::AsyncAwait;
  1         1  
  1         5  
10 1     1   380 use JSON::MaybeXS qw( encode_json decode_json );
  1         8192  
  1         565  
11              
12             our $VERSION = '0.001';
13              
14              
15             sub new {
16 0     0 1   my ( $class, %params ) = @_;
17 0           my $server = delete $params{server};
18 0           my $self = $class->SUPER::new(%params);
19 0 0         $self->{server} = $server if defined $server;
20 0           return $self;
21             }
22              
23             sub configure {
24 0     0 1   my ( $self, %params ) = @_;
25 0 0         if ( exists $params{server} ) {
26 0           $self->{server} = delete $params{server};
27             }
28 0           $self->SUPER::configure(%params);
29             }
30              
31              
32             sub server {
33 0     0 1   my ( $self ) = @_;
34 0           return $self->{server};
35             }
36              
37              
38             sub handle_requests {
39 0     0 1   my ( $self ) = @_;
40              
41 0   0       my $loop = $self->loop // IO::Async::Loop->new;
42              
43 0           while ( my $line = ) {
44 0           chomp $line;
45 0 0         next unless length $line;
46              
47 0           my $request = eval { decode_json($line) };
  0            
48 0 0         if ($@) {
49 0           $self->_send_response({
50             jsonrpc => '2.0',
51             id => undef,
52             error => { code => -32700, message => 'Parse error' },
53             });
54 0           next;
55             }
56              
57 0           my $response = $self->server->handle($request);
58 0 0         if ($response) {
59 0           $self->_send_response($response);
60             }
61             }
62             }
63              
64             sub _send_response {
65 0     0     my ( $self, $response ) = @_;
66 0           print STDOUT encode_json($response) . "\n";
67             }
68              
69             1;
70              
71             __END__