Move domain decription to client side; add some more describers
[hcoop/domtool2.git] / src / domain.sml
index 67ff449..969d957 100644 (file)
@@ -796,7 +796,7 @@ val describers : (subject -> string) list ref = ref []
 
 fun registerDescriber f = describers := f :: !describers
 
-fun describeOne arg = String.concat (map (fn f => f arg) (!describers))
+fun describeOne arg = String.concat (map (fn f => f arg) (rev (!describers)))
 
 val line = "-------------------------------\n"
 val dline = "===============================\n"
@@ -811,7 +811,7 @@ fun describe dom =
                       nodes)
 
 datatype description =
-        Filename of { filename : string, heading : string}
+        Filename of { filename : string, heading : string, showEmpty : bool }
        | Extension of { extension : string, heading : string -> string }
                        
 fun considerAll ds {node, domain} =
@@ -832,44 +832,47 @@ fun considerAll ds {node, domain} =
                    case Posix.FileSys.readdir dir of
                        NONE => ()
                      | SOME fname =>
-                       let
-                           fun readFile entries =
-                               let
-                                   val fname = OS.Path.joinDirFile {dir = path,
-                                                                    file = fname}
-
-                                   val inf = TextIO.openIn fname
-
-                                   fun loop entries =
-                                       case TextIO.inputLine inf of
-                                           NONE => entries
-                                         | SOME line => loop (line :: entries)
-                               in
-                                   loop entries
-                                   before TextIO.closeIn inf
-                               end
-                       in
-                           app (fn (d, entries) =>
-                                   case d of
-                                       Filename {filename, heading} =>
-                                       if fname = filename then
-                                           entries := "\n" :: readFile ("\n" :: line :: ":\n" :: heading :: line :: !entries)
-                                       else
-                                           ()
-                                     | Extension {extension, heading} =>
-                                       let
-                                           val {base, ext} = OS.Path.splitBaseExt fname
-                                       in
-                                           case ext of
-                                               NONE => ()
-                                             | SOME extension' =>
-                                               if extension' = extension then
-                                                   entries := "\n" :: readFile ("\n" :: line :: ":\n" :: heading base :: line :: !entries)
-                                               else
-                                                   ()
-                                       end) ds;
-                           loop ()
-                       end
+                       (app (fn (d, entries) =>
+                                let
+                                    fun readFile showEmpty entries' =
+                                        let
+                                            val fname = OS.Path.joinDirFile {dir = path,
+                                                                             file = fname}
+
+                                            val inf = TextIO.openIn fname
+
+                                            fun loop (seenOne, entries') =
+                                                case TextIO.inputLine inf of
+                                                    NONE => if seenOne orelse showEmpty then
+                                                                "\n" :: entries'
+                                                            else
+                                                                !entries
+                                                  | SOME line => loop (true, line :: entries')
+                                        in
+                                            loop (false, entries')
+                                            before TextIO.closeIn inf
+                                        end
+                                in
+                                    case d of
+                                        Filename {filename, heading, showEmpty} =>
+                                        if fname = filename then
+                                            entries := readFile showEmpty ("\n" :: line :: ":\n" :: heading :: line :: !entries)
+                                        else
+                                            ()
+                                      | Extension {extension, heading} =>
+                                        let
+                                            val {base, ext} = OS.Path.splitBaseExt fname
+                                        in
+                                            case ext of
+                                                NONE => ()
+                                              | SOME extension' =>
+                                                if extension' = extension then
+                                                    entries := readFile true ("\n" :: line :: ":\n" :: heading base :: line :: !entries)
+                                                else
+                                                    ()
+                                        end
+                                end) ds;
+                        loop ())
            in
                loop ();
                Posix.FileSys.closedir dir;
@@ -880,6 +883,7 @@ fun considerAll ds {node, domain} =
     end
 
 val () = registerDescriber (considerAll [Filename {filename = "soa",
-                                                  heading = "DNS SOA"}])
+                                                  heading = "DNS SOA",
+                                                  showEmpty = false}])
 
 end