#!/usr/bin/perl
use
5.010;
our
$VERSION
=
'0.38'
;
if
($@) {
die
"This script requires Perinci::CmdLine, please install it first.\n"
;
}
our
%SPEC
;
$SPEC
{gen_doc} = {
v
=> 1.1,
args
=> {
url
=> {
summary
=>
'URL'
,
req
=> 1,
pos
=> 0,
schema
=>
'str*'
,
},
format
=> {
summary
=>
'Format'
,
schema
=>
'str'
,
},
},
};
sub
gen_doc {
state
$pa
= Perinci::Access->new;
my
%args
=
@_
;
my
$url
=
$args
{url} or
return
[400,
"Please specify url"
];
$url
=
"pl:$url"
if
$url
=~ m!^/!;
my
$fname
=
$url
;
$fname
=~ s!.+/!!;
my
$format
=
$args
{
format
} //
"man"
;
$format
=
"text"
unless
File::Which::which(
"pod2man"
) && File::Which::which(
"man"
);
my
$res
=
$pa
->request(
info
=>
$url
);
return
err(500,
"Can't info"
,
$res
)
unless
$res
->[0] == 200;
my
$type
=
$res
->[2]{type};
$res
=
$pa
->request(
meta
=>
$url
);
return
err(
$res
)
unless
$res
->[0] == 200;
my
$meta
=
$res
->[2];
my
$ometa
=
$res
->[3]{orig_meta} // {};
my
$doc
;
if
(
$type
eq
'function'
) {
for
(
qw/args_as result_naked/
) {
$meta
->{
$_
} =
$ometa
->{
$_
}
if
defined
$ometa
->{
$_
};
}
if
(
$format
eq
'man'
) {
$doc
= Perinci::Sub::To::POD->new(
meta
=>
$meta
,
name
=>
$fname
);
$res
=
$doc
->gen_doc;
[200,
"OK"
,
$res
, {
"cmdline.page_result"
=>1,
"cmdline.pager"
=>
"pod2man | man -l -"
}];
}
else
{
$doc
= Perinci::Sub::To::Text->new(
meta
=>
$meta
,
name
=>
$fname
);
$res
=
$doc
->gen_doc;
[200,
"OK"
,
$res
, {
"cmdline.page_result"
=>1}];
}
}
elsif
(
$type
eq
'package'
) {
$res
=
$pa
->request(
child_metas
=>
$url
);
return
err(500,
"Can't child_metas $url"
,
$res
)
unless
$res
->[0] == 200;
my
$cmetas
=
$res
->[2];
my
$ometas
=
$res
->[3]{orig_metas} // {};
for
my
$uri
(
keys
%$cmetas
) {
for
(
qw/args_as result_naked/
) {
$cmetas
->{
$uri
}{
$_
} =
$ometas
->{
$uri
}{
$_
}
if
defined
$ometas
->{
$uri
}{
$_
};
}
}
if
(
$format
eq
'man'
) {
$doc
= Perinci::To::POD->new(
name
=>
$url
,
meta
=>
$meta
,
child_metas
=>
$cmetas
);
$res
=
$doc
->gen_doc;
[200,
"OK"
,
$res
, {
"cmdline.page_result"
=>1,
"cmdline.pager"
=>
"pod2man | man -l -"
}];
}
else
{
$doc
= Perinci::To::Text->new(
name
=>
$url
,
meta
=>
$meta
,
child_metas
=>
$cmetas
);
$res
=
$doc
->gen_doc;
[200,
"OK"
,
$res
, {
"cmdline.page_result"
=>1}];
}
}
else
{
return
[412,
"Unsupported entity type '$type'"
];
}
}
$ENV
{LOG} //= 0;
my
$cmd
= Perinci::CmdLine->new(
url
=>
'/main/gen_doc'
,
);
delete
$cmd
->common_opts->{
format
};
delete
$cmd
->common_opts->{format_options};
$cmd
->run;