]> gitweb.michael.orlitzky.com - dead/htsn-import.git/blobdiff - src/TSN/Picklers.hs
Fix pickle/unpickle of non-interger team_ids and add a test case for it.
[dead/htsn-import.git] / src / TSN / Picklers.hs
index c430b8d84e0d5042805f1fcfd67024d642d29f93..8076b29fc08566e3467c1976cad9fbbf626f52b1 100644 (file)
@@ -6,27 +6,17 @@ module TSN.Picklers (
   xp_team_id )
 where
 
+-- System imports.
 import Data.Time.Clock ( UTCTime )
 import Data.Time.Format ( formatTime, parseTime )
 import System.Locale ( defaultTimeLocale )
 import Text.Printf ( printf )
 import Text.Read ( readMaybe )
 import Text.XML.HXT.Arrow.Pickle (
-  XmlPickler(..),
   xpText,
   xpWrapMaybe )
 import Text.XML.HXT.Arrow.Pickle.Xml ( PU )
 
-instance XmlPickler Bool where
-  xpickle =
-    (to_bool, from_bool) `xpWrapMaybe` xpText
-    where
-      to_bool :: String -> Maybe Bool
-      to_bool = readMaybe
-
-      from_bool :: Bool -> String
-      from_bool = show
-
 
 -- | (Un)pickle a UTCTime without the time portion.
 --
@@ -43,21 +33,19 @@ xp_date =
     from_date = formatTime defaultTimeLocale format
 
 
--- | Parse a team_id. This *should* just be an 'Int', but TSN is doing
---   something weird. First of all, player IDs do look like normal
---   'Int's. But the team IDs are all stuck in the triple digits, and
---   double-digit team IDs appear to be padded to three characters
---   with a leading '0'. So maybe they're treating these as text?
---
---   In any case, we do the simplest thing that is correct for all the
---   XML we've got: pad it to (only) three digits on pickling.
+-- | Parse a team_id. These are (so far!) three characters long, and
+--   not necessarily numeric. For simplicity, we return a 'String'
+--   rather than e.g. a @(Char, Char, Char)@. But unpickling will fail
+--   if the team_id is longer than three characters.
 --
-xp_team_id :: PU Int
+xp_team_id :: PU String
 xp_team_id =
   (to_team_id, from_team_id) `xpWrapMaybe` xpText
   where
-    to_team_id :: String -> Maybe Int
-    to_team_id = readMaybe
+    to_team_id :: String -> Maybe String
+    to_team_id s
+      | length s <= 3 = Just s
+      | otherwise = Nothing
 
-    from_team_id :: Int -> String
-    from_team_id = printf "%03d"
+    from_team_id :: String -> String
+    from_team_id = id