]> gitweb.michael.orlitzky.com - dead/htsn-import.git/commitdiff
Allow "TBA" laps in TSN.XML.AutoRacingSchedule. master
authorMichael Orlitzky <michael@orlitzky.com>
Mon, 30 Mar 2015 19:16:05 +0000 (15:16 -0400)
committerMichael Orlitzky <michael@orlitzky.com>
Mon, 30 Mar 2015 19:16:05 +0000 (15:16 -0400)
doc/TODO
src/TSN/Picklers.hs
src/TSN/XML/AutoRacingSchedule.hs

index 6748d67eda3c889b741e661f556052fde24dbb53..9ae15d28ff69fa94554a8c544ebe6ffc70b996fc 100644 (file)
--- a/doc/TODO
+++ b/doc/TODO
@@ -49,3 +49,5 @@
    two copies of newsxml just because one has an empty attribute that
    we want to test: we could just delete an attribute from the first
    file.
+
+6. Update the Auto_Racing_Schedule_XML schema diagram.
index 3135d6ae194d483f3704755d46063cc513393808..4f0020b6ad167123c10a66224a0b5092f09b8489 100644 (file)
@@ -14,6 +14,7 @@ module TSN.Picklers (
   xp_earnings,
   xp_fracpart_only_double,
   xp_gamedate,
+  xp_tba_int,
   xp_tba_time,
   xp_time,
   xp_time_dots,
@@ -451,6 +452,46 @@ xp_tba_time =
     from_time (Just t) = formatTime defaultTimeLocale time_format t
 
 
+-- | (Un)pickle a 'Int', allowing for a value of \"TBA\" (which gets
+--   translated to 'Nothing').
+--
+--   /Examples/:
+--
+--   A failed parse will return 'Nothing':
+--
+--   >>> let tn = text_node "YO"
+--   >>> unpickleDoc xp_tba_int tn
+--   Just Nothing
+--
+--   And so will parsing a \"TBA\":
+--
+--   >>> let tn = text_node "TBA"
+--   >>> unpickleDoc xp_tba_int tn
+--   Just Nothing
+--
+--   But re-pickling 'Nothing' gives only \"TBA\":
+--
+--   >>> pickleDoc xp_tba_int Nothing
+--   NTree (XTag "/" []) [NTree (XText "TBA") []]
+--
+--   A normal integer is also parsed successfully, of course:
+--
+--   >>> let tn = text_node "110"
+--   >>> unpickleDoc xp_tba_int tn
+--   Just (Just 110)
+--
+xp_tba_int :: PU (Maybe Int)
+xp_tba_int =
+  (to_int, from_int) `xpWrap` xpText
+  where
+    to_int :: String -> Maybe Int
+    to_int = readMaybe
+
+    from_int :: Maybe Int -> String
+    from_int Nothing = "TBA"
+    from_int (Just t) = show t
+
+
 
 -- | (Un)pickle the \<time_stamp\> element format to/from a 'UTCTime'.
 --   The time_stamp elements look something like,
index 64132bcb0f1ad7bf07903d7c9200eb81051371c1..edfcaacb44c919fa6cf507b0fc5f6c0856ebd1f9 100644 (file)
@@ -58,7 +58,7 @@ import Text.XML.HXT.Core (
 import TSN.Codegen (
   tsn_codegen_config )
 import TSN.DbImport ( DbImport(..), ImportResult(..), run_dbmigrate )
-import TSN.Picklers ( xp_date_padded, xp_tba_time, xp_time_stamp )
+import TSN.Picklers ( xp_date_padded, xp_tba_int, xp_tba_time, xp_time_stamp )
 import TSN.XmlImport ( XmlImport(..), XmlImportFk(..) )
 import Xml (
   Child(..),
@@ -160,7 +160,7 @@ data AutoRacingScheduleListing =
     db_track_name :: String,
     db_location :: String,
     db_tv_listing :: Maybe String,
-    db_laps :: Int,
+    db_laps :: Maybe Int,
     db_track_length :: String -- ^ Sometimes the word "miles" shows up.
   }
 
@@ -177,7 +177,7 @@ data AutoRacingScheduleListingXml =
     xml_track_name :: String,
     xml_location :: String,
     xml_tv_listing :: Maybe String,
-    xml_laps :: Int,
+    xml_laps :: Maybe Int,
     xml_track_length :: String, -- ^ Sometimes the word \"miles\" shows up,
                                 --   so we can't do the right thing and use
                                 --   a 'Double'.
@@ -436,7 +436,7 @@ pickle_listing =
                 (xpElem "TrackName" xpText)
                 (xpElem "Location" xpText)
                 (xpElem "TV_Listing" $ xpOption xpText)
-                (xpElem "Laps" xpInt)
+                (xpElem "Laps" xp_tba_int)
                 (xpElem "TrackLength" xpText)
                 (xpList pickle_race_results)
   where