]> gitweb.michael.orlitzky.com - dead/htsn.git/commitdiff
Add more code comments.
authorMichael Orlitzky <michael@orlitzky.com>
Fri, 20 Dec 2013 03:54:08 +0000 (22:54 -0500)
committerMichael Orlitzky <michael@orlitzky.com>
Fri, 20 Dec 2013 03:54:08 +0000 (22:54 -0500)
src/CommandLine.hs
src/Configuration.hs
src/Main.hs
src/TSN/FeedHosts.hs
src/TSN/Xml.hs

index 40a1ac887fe3a78de7fa762f8290e3a655ee4248..071c5209307116787404555eecfa941b22b1488a 100644 (file)
@@ -1,3 +1,5 @@
+-- | Parse the command-line options, and display help text if
+--   necessary.
 module CommandLine (
   get_args )
 where
@@ -13,33 +15,44 @@ import System.Console.CmdArgs (
   typ,
   typDir )
 
--- Get the version from Cabal.
+-- This let's us get the version from Cabal.
 import Paths_htsn (version)
 import Data.Version (showVersion)
 
 import OptionalConfiguration (OptionalConfiguration(..))
 
+
+-- | The description of the program, displayed as part of the help.
 description :: String
 description = "Parse XML files from The Sports Network."
 
+-- | The name of this program.
 program_name :: String
 program_name = "htsn"
 
+-- | A summary string output as part of the help.
 my_summary :: String
 my_summary = program_name ++ "-" ++ (showVersion version)
 
+
+-- | A description of the "password" option.
 password_help :: String
 password_help =
   "Password to use when connecting to the feed"
 
+-- | A description of the "output_directory" option.
 output_directory_help :: String
 output_directory_help =
   "Directory in which to output the XML files; must be writable"
 
+-- | A description of the "username" option.
 username_help :: String
 username_help =
   "Username to use when connecting to the feed"
 
+-- | A data structure representing the possible command-line
+--   options. The CmdArgs library is doing heavy magic beneath the
+--   hood here.
 arg_spec :: OptionalConfiguration
 arg_spec =
   OptionalConfiguration {
@@ -52,6 +65,7 @@ arg_spec =
   &= details [description]
 
 
-
+-- | A convenience function; our only export. Meant to be used in
+--   'main' to retrieve the command-line arguments.
 get_args :: IO OptionalConfiguration
 get_args = cmdArgs arg_spec
index 71dbbc9e4c83310bac66a53152473a8be0e57d27..7b237c5f1d0d350de28b8d00bc711fabcc78ee2c 100644 (file)
@@ -1,7 +1,7 @@
 -- | This module defines the 'Configuration' type, which is just a
 --   wrapper around all of the configuration options we accept on the
---   command line. We thread this throughout the rest of the program.
-
+--   command line.
+--
 module Configuration (
   Configuration(..),
   merge_optional )
@@ -25,6 +25,10 @@ data Configuration =
 instance Default Configuration where
   def = Configuration def def "." def
 
+
+-- | Merge a Configuration with an OptionalConfiguration. This is more
+--   or less the Monoid instance for OptionalConfiguration, but since
+--   the two types are different, we have to repeat ourselves.
 merge_optional :: Configuration
                -> OC.OptionalConfiguration
                -> Configuration
index 374981248fd9bf2b17905175949914d89cea70e4..1b7458fe880c83463038abbc2de73be16f3d09ff 100644 (file)
@@ -44,6 +44,9 @@ import TSN.FeedHosts (FeedHosts(..))
 import TSN.Xml (parse_xmlfid, xml_prologue)
 
 
+-- | Receive a single line of text from a Handle, echoing it to stdout
+--   in the process.
+--
 recv_line :: Handle -> IO String
 recv_line h = do
   line <- hGetLine h
@@ -51,6 +54,13 @@ recv_line h = do
   return line
 
 
+-- | Takes a Configuration, and an XML document (as a String). The XML
+--   document is written to the output directory, as specified by the
+--   Configuration.
+--
+--   This can fail, but we don't purposefully throw any exceptions. If
+--   something goes wrong, we would rather log it and keep going.
+--
 save_document :: Configuration -> String -> IO ()
 save_document cfg doc =
   case maybe_path of
@@ -67,8 +77,11 @@ save_document cfg doc =
     filename = fmap (++ ".xml") xmlfid
     maybe_path = fmap ((output_directory cfg) </>) filename
 
+
 -- | Loop forever, writing the buffer to file whenever a new XML
---   prologue is seen.
+--   prologue is seen. This is the low-level "loop forever" function
+--   that we stay in as long as we are connected to one feed.
+--
 loop :: Configuration -> Handle -> [String] -> IO ()
 loop !cfg !h !buffer = do
   line <- recv_line h
@@ -83,7 +96,8 @@ loop !cfg !h !buffer = do
     save_document cfg document
     loop cfg h [line] -- empty the buffer before looping again
   else
-    loop cfg h (line : buffer) -- append line to the head of the buffer and loop
+    -- append line to the head of the buffer and loop
+    loop cfg h (line : buffer)
 
 
 log_in :: Configuration -> Handle -> IO ()
@@ -152,12 +166,14 @@ connect_and_loop cfg host = do
 
 -- | A wrapper around threadDelay which takes seconds instead of
 --   microseconds as its argument.
+--
 thread_sleep :: Int -> IO ()
 thread_sleep seconds = do
   let microseconds = seconds * (10 ^ (6 :: Int))
   threadDelay microseconds
 
 
+-- | The entry point of the program.
 main :: IO ()
 main = do
   rc_cfg <- OC.from_rc
@@ -187,12 +203,21 @@ main = do
   -- set in either the config file or on the command-line.
   let cfg = (def :: Configuration) `merge_optional` opt_config
 
+  -- This may be superstition (and I believe stderr is unbuffered),
+  -- but it can't hurt.
   hSetBuffering stderr NoBuffering
   hSetBuffering stdout NoBuffering
 
+  -- Begin connecting to our feed hosts, starting with the first one.
   round_robin cfg 0
 
   where
+    -- | This is the top-level "loop forever" function. If an
+    --   exception is thrown, it will propagate up to this point, where
+    --   it will be logged and ignored in style.
+    --
+    --   Afterwards, we recurse (call ourself) again to loop more forevers.
+    --
     round_robin :: Configuration -> Int -> IO ()
     round_robin cfg feed_host_idx = do
       let hosts = get_feed_hosts $ feed_hosts cfg
index 0b2056ec3ee983587b2ed74133ebfebc15fa6bdd..58831e5cc2fd5d06b87c30792d55444af37d94ea 100644 (file)
@@ -34,11 +34,18 @@ instance Default FeedHosts where
 
 
 instance DCT.Configured FeedHosts where
+  -- | This allows us to read a FeedHosts object out of a Configurator
+  --   config file. By default Configurator wouldn't know what to do,
+  --   so we have to tell it that we expect a list, and if that list
+  --   has strings in it, we can apply the FeedHosts constructor to
+  --   it.
   convert (DCT.List xs) =
+    -- mapM gives us a Maybe [String] here.
     fmap FeedHosts (mapM convert_string xs)
     where
       convert_string :: DCT.Value -> Maybe String
       convert_string = DCT.convert
 
+  -- If we read anything other than a list of values out of the file,
+  -- fail.
   convert _ = Nothing
-
index 1f057f9982cd9b299a1c97db2913ecc395e12118..ead8015de509481f31ca9ec3b4e23ac89b0fadc5 100644 (file)
@@ -1,3 +1,6 @@
+-- | Minimal XML functionality needed to parse each document's
+--   XML_File_ID.
+--
 module TSN.Xml (
   parse_xmlfid,
   xml_prologue )