push @{$method_registry->{$self}}, $info;
}
+sub register_page_formatter {
+ my ($self, %config) = @_;
+
+ my $format = $config{format} ||
+ die "missing format";
+
+ my $path = $config{path} ||
+ die "missing path";
+
+ my $method = $config{method} ||
+ die "missing method";
+
+ my $code = $config{code} ||
+ die "missing formatter code";
+
+ my $uri_param = {};
+ my ($handler, $info) = $self->find_handler($method, $path, $uri_param);
+ die "unabe to find handler for '$method: $path'" if !($handler && $info);
+
+ die "duplicate formatter for '$method: $path'"
+ if $info->{formatter} && $info->{formatter}->{$format};
+
+ $info->{formatter}->{$format} = $code;
+}
+
sub AUTOLOAD {
my ($this) = @_;
}
sub map_path_to_methods {
- my ($class, $stack, $uri_param) = @_;
+ my ($class, $stack, $uri_param, $pathmatchref) = @_;
my $path_lookup = $method_path_lookup->{$class};
- while (my $comp = shift @$stack) {
+ # Note: $pathmatchref can be used to obtain path including
+ # uri patterns like '/cluster/firewall/groups/{group}'.
+ # Used by pvesh to display help
+ if (defined($pathmatchref)) {
+ $$pathmatchref = '' if !$$pathmatchref;
+ }
+
+ while (defined(my $comp = shift @$stack)) {
return undef if !$path_lookup; # not registerd?
if ($path_lookup->{regex}) {
my $name = $path_lookup->{regex}->{match_name};
return undef if $comp !~ m/^($regex)$/;
$uri_param->{$name} = $1;
$path_lookup = $path_lookup->{regex};
+ $$pathmatchref .= '/{' . $name . '}' if defined($pathmatchref);
} elsif ($path_lookup->{folders}) {
$path_lookup = $path_lookup->{folders}->{$comp};
+ $$pathmatchref .= '/' . $comp if defined($pathmatchref);
} else {
die "internal error";
}
}
sub find_handler {
- my ($class, $method, $path, $uri_param) = @_;
+ my ($class, $method, $path, $uri_param, $pathmatchref) = @_;
my $stack = [ grep { length($_) > 0 } split('\/+' , $path)]; # skip empty fragments
my ($handler_class, $path_info);
eval {
- ($handler_class, $path_info) = $class->map_path_to_methods($stack, $uri_param);
+ ($handler_class, $path_info) = $class->map_path_to_methods($stack, $uri_param, $pathmatchref);
};
my $err = $@;
syslog('err', $err) if $err;