File Coverage

blib/lib/WWW/Kosoku/API.pm
Criterion Covered Total %
statement 13 15 86.6
branch n/a
condition n/a
subroutine 5 5 100.0
pod n/a
total 18 20 90.0


line stmt bran cond sub pod time code
1             package WWW::Kosoku::API;
2 2     2   20836 use 5.008005;
  2         7  
  2         69  
3 2     2   11 use strict;
  2         3  
  2         263  
4 2     2   22 use warnings;
  2         4  
  2         70  
5 2     2   1481 use utf8;
  2         15  
  2         23  
6 2     2   3357 use Mouse;
  0            
  0            
7             use URI;
8             use Furl;
9             use XML::Simple;
10             use Carp;
11              
12             our $VERSION = "0.09";
13              
14             use constant BASE_URL => 'http://kosoku.jp/api/route.php?';
15              
16             has 'f' => (is => 'rw', isa => 'Str',required => 1);
17             has 't' => (is => 'rw', isa => 'Str',required => 1);
18             has 'c' => (is => 'rw', isa => 'Str',required => 1,default => '普通車');
19             has 's' => (is => 'rw', isa => 'Str');
20             has 'sortBy' => (is => 'rw',isa => 'Str',default => '距離');
21              
22             has furl => (
23             is => 'rw',
24             isa => 'Furl',
25             default => sub{
26             my $furl = Furl->new(
27             agent => 'WWW::Kosoku::API(Perl)',
28             timeout => 10,
29             );
30             $furl;
31             },
32             );
33              
34             has response => (
35             is => 'ro',
36             isa => 'HashRef',
37             default => sub{
38             my $self = shift;
39             my $url = URI->new(BASE_URL);
40             $url->query_form(f => $self->f,t => $self->t,c => $self->c);
41             my $response = $self->furl->get($url);
42             my $res = eval{
43             my $xml = new XML::Simple();
44             $xml->XMLin($response->decoded_content);
45             };
46             if($@){
47             croak("Oh! faild reading XML");
48             }
49             return $res;
50             },
51             );
52              
53             #routenumber and subsections
54             sub get_subsection{
55             my $self = shift;
56             my $subsection = [];
57             my $res = $self->response;
58             for my $route(@{$res->{Routes}->{Route}}){
59             for my $sec(@{$route->{Details}->{Section}}){
60             push @{$subsection},{$route->{RouteNo},$sec->{SubSections}->{SubSection}};
61             }
62             }
63             return $subsection;
64             }
65              
66             # section_count in routenumber
67             sub get_section_no_by_routenumber{
68             my($self,$routenumber) = @_;
69             my $res = $self->response;
70             return $res->{Routes}->{Route}->[$routenumber]->{Details}->{No};
71             }
72              
73             sub get_section_info_by_routenumber_sectionnumber{
74             my($self,$routenumber,$sectionno) = @_;
75             if($routenumber < 0 || $self->get_route_count <= $routenumber){
76             croak("no routenumber:$routenumber");
77             }
78             if($sectionno < 0 || $sectionno >= $self->get_section_no_by_routenumber){
79             croak("no section_no_number:$sectionno");
80             }
81             my $res = $self->response;
82             return $res->{Routes}->{Route}->[$routenumber]->{Details}->{Section}->[$sectionno];
83             }
84              
85             #get subsection by routenumber and sectionnumber
86             sub get_subsection_by_routenumber_and_sectionnumber{
87             my($self,$routenumber,$sectionnumber) = @_;
88             if($routenumber < 0 || $self->get_route_count <= $routenumber){
89             croak("no routenumber:$routenumber");
90             }
91             if($sectionnumber < 0 || $sectionnumber >= $self->get_section_no_by_routenumber){
92             croak("no section_no_number:$sectionnumber");
93             }
94             my $res = $self->response;
95             return $res->{Routes}->{Route}->[$routenumber]->{Details}->{Section}->[$sectionnumber]->{SubSections}->{SubSection};
96             }
97              
98             #get section info by routenumber
99             sub get_section_by_routenumber{
100             my($self,$routenumber) = @_;
101             if($routenumber < 0 || $self->get_route_count <= $routenumber){
102             croak("no routenumber:$routenumber");
103             }
104             my $res = $self->response;
105             return $res->{Routes}->{Route}->[$routenumber]->{Details}->{Section};
106             }
107              
108             #get section toll by routenumber and sectionnumber
109             sub get_section_tolls_by_routenumber_and_sectionnumber{
110             my($self,$routenumber,$sectionnumber) = @_;
111             my $section_info = $self->get_section_info_by_routenumber_sectionnumber($routenumber,$sectionnumber);
112             return $section_info->{Tolls}->{Toll};
113             }
114              
115             #get time and toll and legnth by routenumber
116             sub get_summary_by_routenumber{
117             my($self,$routenumber) = @_;
118             my $res = $self->response;
119             return $res->{Routes}->{Route}->[$routenumber]->{Summary};
120             }
121              
122             sub get_all_summary{
123             my $self = shift;
124             my $summary_list = [];
125             for my $count(0..$self->get_route_count-1){
126             push @$summary_list,$self->get_summary_by_routenumber($count);
127             $summary_list->[$count]->{count} = $count + 1;
128             }
129             return $summary_list;
130             }
131              
132             #get route count
133             sub get_route_count{
134             my $self = shift;
135             my $res = $self->response;
136             scalar @{$res->{Routes}->{Route}};
137             }
138              
139             # get subsectionsinfo by routenumber
140             sub get_subsections_by_routenumber{
141             my ($self,$routenumber) = @_;
142             if($routenumber < 0 || $routenumber >= $self->get_route_count){
143             croak("no route number:$routenumber");
144             }
145             my $subsection = $self->get_subsection;
146             my @sub_list;
147             for my $sub (@{$subsection}){
148             next if not defined $sub->{$routenumber};
149             if(ref $sub->{$routenumber} eq 'ARRAY'){
150             push @sub_list,@{$sub->{$routenumber}};
151             }elsif(ref $sub->{$routenumber} eq 'HASH'){
152             push @sub_list,$sub->{$routenumber};
153             }
154             }
155             return \@sub_list;
156             }
157              
158             sub get_subsections_and_sectioncount_by_routenumber{
159             my($self,$routenumber) = @_;
160             my $subsection = [];
161             my $subsection_info = $self->get_subsection;
162             my $sectioncount = 0;
163             for my $key(@{$subsection_info}){
164             next if not defined $key->{$routenumber};
165             if(ref $key->{$routenumber} eq 'ARRAY'){
166             push @$subsection,@{$key->{$routenumber}};
167             }elsif(ref $key->{$routenumber} eq 'HASH'){
168             push @$subsection,$key->{$routenumber};
169             }
170             $sectioncount++;
171             }
172             return $subsection;
173             }
174              
175             sub get_all_route_information{
176             my $self = shift;
177             my $infos = [];
178             my $route = $self->get_route_count;
179             for my $routecount(0..$route){
180             my $summary = $self->get_summary_by_routenumber($routecount);
181             my $routeinfo = {};
182             my $section_count = $self->get_section_no_by_routenumber($routecount);
183             my $section_info = [];
184             for my $sectioncount(0..$section_count-1){
185             my $section = {};
186             my $toll = $self->get_section_tolls_by_routenumber_and_sectionnumber($routecount,$sectioncount);
187             $section->{toll} = $toll;
188             $section->{subsections} = $self->get_subsection_by_routenumber_and_sectionnumber($routecount,$sectioncount);
189             push @$section_info,$section;
190             }
191             $routeinfo->{summary} = $summary;
192             $routeinfo->{section} = $section_info;
193             push @$infos,$routeinfo;
194             }
195             return $infos;
196             }
197              
198             1;
199              
200              
201              
202             __END__