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   51599 use 5.008005;
  2         8  
  2         83  
3 2     2   10 use strict;
  2         4  
  2         82  
4 2     2   29 use warnings;
  2         4  
  2         77  
5 2     2   1020 use utf8;
  2         14  
  2         17  
6 2     2   16135 use Mouse;
  0            
  0            
7             use URI;
8             use Furl;
9             use XML::Simple;
10             use Carp;
11              
12             our $VERSION = "0.03";
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             sub response{
35             my $self = shift;
36             my $url = URI->new(BASE_URL);
37             $url->query_form(f => $self->f,t => $self->t,c => $self->c);
38             my $response = $self->furl->get($url);
39             my $ref = eval{
40             my $xs = new XML::Simple();
41             $xs->XMLin($response->content);
42             };
43             if($@){
44             croak("Oh! faild reading XML");
45             }
46             return $ref;
47             }
48              
49             use Data::Dumper;
50              
51             #routenumber and subsections
52             sub get_subsection{
53             my $self = shift;
54             my $subsection = [];
55             my $ref = $self->response;
56             for my $route(@{$ref->{Routes}->{Route}}){
57             for my $sec(@{$route->{Details}->{Section}}){
58             push @{$subsection},{$route->{RouteNo},$sec->{SubSections}->{SubSection}};
59             }
60             }
61             return $subsection;
62             }
63              
64             # section_count in routenumber
65             sub get_section_no_by_routenumber{
66             my ($self,$routenumber) = @_;
67             my $ref = $self->response;
68             return $ref->{Routes}->{Route}->[$routenumber]->{Details}->{No};
69             }
70              
71             sub get_section_info_by_routenumber_sectionnumber{
72             my($self,$routenumber,$sectionno) = @_;
73             if($routenumber < 0 || $self->get_route_count <= $routenumber){
74             croak("no routenumber:$routenumber");
75             }
76             if($sectionno < 0 || $sectionno >= $self->get_section_no_by_routenumber){
77             croak("no section_no_number:$sectionno");
78             }
79             my $ref = $self->response;
80             return $ref->{Routes}->{Route}->[$routenumber]->{Details}->{Section}->[$sectionno];
81             }
82              
83             #get subsection by routenumber and sectionnumber
84             sub get_subsection_by_routenumber_and_sectionnumber{
85             my($self,$routenumber,$sectionnumber) = @_;
86             if($routenumber < 0 || $self->get_route_count <= $routenumber){
87             croak("no routenumber:$routenumber");
88             }
89             if($sectionnumber < 0 || $sectionnumber >= $self->get_section_no_by_routenumber){
90             croak("no section_no_number:$sectionnumber");
91             }
92             my $ref = $self->response;
93             return $ref->{Routes}->{Route}->[$routenumber]->{Details}->{Section}->[$sectionnumber]->{SubSections}->{SubSection};
94             }
95              
96             #get section info by routenumber
97             sub get_section_by_routenumber{
98             my($self,$routenumber) = @_;
99             if($routenumber < 0 || $self->get_route_count <= $routenumber){
100             croak("no routenumber:$routenumber");
101             }
102             my $ref = $self->response;
103             return $ref->{Routes}->{Route}->[$routenumber]->{Details}->{Section};
104             }
105              
106             #get section toll by routenumber and sectionnumber
107             sub get_section_tolls_by_routenumber_and_sectionnumber{
108             my($self,$routenumber,$sectionnumber) = @_;
109             my $section_info = $self->get_section_info_by_routenumber_sectionnumber($routenumber,$sectionnumber);
110             return $section_info->{Tolls}->{Toll};
111             }
112              
113             #get time and toll and legnth by routenumber
114             sub get_summary_by_routenumber{
115             my($self,$routenumber) = @_;
116             my $ref = $self->response;
117             return $ref->{Routes}->{Route}->[$routenumber]->{Summary};
118             }
119              
120             #get route count
121             sub get_route_count{
122             my $self = shift;
123             my $ref = $self->response;
124             scalar @{$ref->{Routes}->{Route}};
125             }
126              
127             # get subsectionsinfo by routenumber
128             sub get_subsections_by_routenumber{
129             my ($self,$routenumber) = @_;
130             if($routenumber < 0 || $routenumber >= $self->get_route_count){
131             croak("no route number:$routenumber");
132             }
133             my $subsection = $self->get_subsection;
134             my $sub_list = [];
135             for my $sub (@{$subsection}){
136             if(defined $sub->{$routenumber}){
137             if(ref $sub->{$routenumber} eq 'ARRAY'){
138             for my $subsec(@{$sub->{$routenumber}}){
139             push @$sub_list,$subsec;
140             }
141             }elsif(ref $sub->{$routenumber} eq 'HASH'){
142             push @$sub_list,$sub->{$routenumber};
143             }
144             }
145             }
146             return $sub_list;
147             }
148              
149             sub get_subsections_and_sectioncount_by_routenumber{
150             my($self,$routenumber) = @_;
151             my $subsection = [];
152             my $subsection_info = $self->get_subsection;
153             my $sectioncount = 0;
154             for my $key(@{$subsection_info}){
155             if(defined $key->{$routenumber}){
156             if(ref $key->{$routenumber} eq 'ARRAY'){
157             push @$subsection,@{$key->{$routenumber}};
158             }elsif(ref $key->{$routenumber} eq 'HASH'){
159             push @$subsection,$key->{$routenumber};
160             }
161             $sectioncount++;
162             }
163             }
164             return $sectioncount;
165             }
166              
167             1;
168              
169              
170             __END__