sort order in a more prominent place
authorHeiko Schlittermann (JUMPER) <hs@schlittermann.de>
Wed, 14 Jan 2015 09:18:35 +0100
changeset 60 34d98030d4c0
parent 59 9a90748c1173
child 61 bedb2cce973e
sort order in a more prominent place Now we have a %ORDER global variable in the package DNS::Vi
lib/DNS/Vi.pm
--- a/lib/DNS/Vi.pm	Wed Jan 14 09:14:25 2015 +0100
+++ b/lib/DNS/Vi.pm	Wed Jan 14 09:18:35 2015 +0100
@@ -13,6 +13,10 @@
 our @EXPORT    = qw(ttl2h h2ttl parse delta nice edit update show);
 our @EXPORT_OK = ();
 
+
+# the sort order for the records of the same label
+my %ORDER = map { state $n = 0; $_ => ++$n } qw(SOA NS TXT MX A AAAA SSHFP);
+
 sub parse {
     my %arg   = %{ pop @_ } if ref $_[-1] eq 'HASH';
     my $data  = shift;
@@ -123,55 +127,51 @@
     return $out // $ttl;
 }
 
-{
-    my %order = map { state $n = 0; $_ => ++$n } qw(SOA NS TXT MX A AAAA SSHFP);
-
-    sub nice {
+sub nice {
 
-        # get a list of { id => $id, rrset => \%rrset }
-	# we do a schwartz transformation here
-	# [ reverse LABEL, RRSET ]
-        my @zone = map { $_->[1] }
-          sort {
-	      $a->[0] cmp $b->[0]
-              or length $a->[1]{label} <=> length $b->[1]{label}
-              or ($order{ $a->[1]{rrtype} } // 99) <=> ($order{ $b->[1]{rrtype} } // 99)
-          }
-          map { [scalar reverse($_->{label}), $_] } map { $_->{rrset} } @_;
+    # get a list of { id => $id, rrset => \%rrset }
+    # we do a schwartz transformation here
+    # [ reverse LABEL, RRSET ]
+    my @zone = map { $_->[1] }
+	sort {
+	    $a->[0] cmp $b->[0]
+	    or length $a->[1]{label} <=> length $b->[1]{label}
+	    or ($ORDER{ $a->[1]{rrtype} } // 99) <=> ($ORDER{ $b->[1]{rrtype} } // 99)
+	}
+	map { [scalar reverse($_->{label}), $_] } map { $_->{rrset} } @_;
 
-        my @out;
-        my $origin = (grep { $_->{rrtype} eq 'SOA' } @zone)[0]->{label};
-        my $ttl    = (grep { $_->{rrtype} eq 'SOA' } @zone)[0]->{ttl};
-        my $len1 =
-          (sort { $a <=> $b } map { index $_->{label}, '.' } @zone)[-1];
-        my $len2 = (sort { $a <=> $b } map { length $_->{rrtype} } @zone)[-1];
-        push @out, "\$ORIGIN $origin", "\$TTL " . ttl2h($ttl);
+    my @out;
+    my $origin = (grep { $_->{rrtype} eq 'SOA' } @zone)[0]->{label};
+    my $ttl    = (grep { $_->{rrtype} eq 'SOA' } @zone)[0]->{ttl};
+    my $len1 =
+	(sort { $a <=> $b } map { index $_->{label}, '.' } @zone)[-1];
+    my $len2 = (sort { $a <=> $b } map { length $_->{rrtype} } @zone)[-1];
+    push @out, "\$ORIGIN $origin", "\$TTL " . ttl2h($ttl);
 
-        my $print = sub {
-            my %r = %{ +shift };
-            state $last_label;
+    my $print = sub {
+	my %r = %{ +shift };
+	state $last_label;
 
-            $r{label} = '@' if $r{label} eq $origin;
-            $r{label} =~ s{\.\Q$origin\E$}{};
-            $r{data} =~ s{\.\Q$origin\E$}{}
-              if $r{rrtype} ~~ [qw(CNAME MX SOA PTR)];
-            $r{data} =~ s{\Q$origin\E$}{\@} if $r{rrtype} ~~ [qw(CNAME MX)];
-            $r{ttl} = $r{ttl} == $ttl ? '' : ttl2h($r{ttl});
-            $r{label} = do {
-                if (defined $last_label and $r{label} eq $last_label) { '' }
-                else { $last_label = $r{label} }
-            };
+	$r{label} = '@' if $r{label} eq $origin;
+	$r{label} =~ s{\.\Q$origin\E$}{};
+	$r{data} =~ s{\.\Q$origin\E$}{}
+	    if $r{rrtype} ~~ [qw(CNAME MX SOA PTR)];
+	$r{data} =~ s{\Q$origin\E$}{\@} if $r{rrtype} ~~ [qw(CNAME MX)];
+	$r{ttl} = $r{ttl} == $ttl ? '' : ttl2h($r{ttl});
+	$r{label} = do {
+	    if (defined $last_label and $r{label} eq $last_label) { '' }
+	    else { $last_label = $r{label} }
+	};
 
-            return sprintf '%-*s %6s %-*s    %s',
-              $len1 => $r{label},
-              $r{ttl},
-              $len2 => $r{rrtype},
-              $r{data};
-        };
-        push @out, '; do NOT EDIT the SOA records SERIAL number!';
-        push @out, $print->($_) foreach @zone;
-        return join "\n", @out, '';
-    }
+	return sprintf '%-*s %6s %-*s    %s',
+	    $len1 => $r{label},
+	    $r{ttl},
+	    $len2 => $r{rrtype},
+	    $r{data};
+    };
+    push @out, '; do NOT EDIT the SOA records SERIAL number!';
+    push @out, $print->($_) foreach @zone;
+    return join "\n", @out, '';
 }
 
 sub delta {