]> git.proxmox.com Git - pve-http-server.git/blobdiff - PVE/APIServer/Formatter.pm
rework formatter registration
[pve-http-server.git] / PVE / APIServer / Formatter.pm
index 29f1898a5243b41612f85b328f022a334337b016..fa26756fd88c86aa1537074d8e96f6e1f02633a0 100644 (file)
@@ -3,53 +3,74 @@ package PVE::APIServer::Formatter;
 use strict;
 use warnings;
 
+use URI::Escape;
+
 # generic formatter support
 # PVE::APIServer::Formatter::* classes should register themselves here
 
 my $formatter_hash = {};
+my $page_formatter_hash = {};
 
 sub register_formatter {
-    my ($format, $func) = @_;
+    my ($format, $code) = @_;
+
+    die "formatter '$format' already defined"
+       if defined($formatter_hash->{$format});
+
+    $formatter_hash->{$format} = $code;
+}
+
+sub register_page_formatter {
+    my (%config) = @_;
+
+    my $format = $config{format} ||
+       die "missing format";
 
-    die "formatter '$format' already defined" if $formatter_hash->{$format};
+    my $path = $config{path} ||
+       die "missing path";
 
-    $formatter_hash->{$format} = {
-       func => $func,
-    };
+    my $method = $config{method} ||
+       die "missing method";
+
+    my $code = $config{code} ||
+       die "missing formatter code";
+
+    die "duplicate page formatter for '$method: $path'"
+       if defined($page_formatter_hash->{$format}->{$method}->{$path});
+
+    $page_formatter_hash->{$format}->{$method}->{$path} = $code;
 }
 
 sub get_formatter {
-    my ($format) = @_;
+    my ($format, $method, $path) = @_;
 
-     return undef if !$format;
+    return undef if !defined($format);
 
-    my $info = $formatter_hash->{$format};
-    return undef if !$info;
+    if (defined($method) && defined($path)) {
+       my $code = $page_formatter_hash->{$format}->{$method}->{$path};
+       return $code if defined($code);
+    }
 
-    return $info->{func};
+    return $formatter_hash->{$format};
 }
 
 my $login_formatter_hash = {};
 
 sub register_login_formatter {
-    my ($format, $func) = @_;
+    my ($format, $code) = @_;
 
-    die "login formatter '$format' already defined" if $login_formatter_hash->{$format};
+    die "login formatter '$format' already defined"
+       if defined($login_formatter_hash->{$format});
 
-    $login_formatter_hash->{$format} = {
-       func => $func,
-    };
+    $login_formatter_hash->{$format} = $code;
 }
 
 sub get_login_formatter {
     my ($format) = @_;
 
-    return undef if !$format;
-
-    my $info = $login_formatter_hash->{$format};
-    return undef if !$info;
+    return undef if !defined($format);
 
-    return $info->{func};
+    return $login_formatter_hash->{$format};
 }
 
 # some helper functions