module System.USB.IDDB.UsbDotOrg
(
parseDb
, staticDb
, fromFile
, dbURL
) where
import Control.Monad ( (>>=), (>>), fail, fmap, return )
import Data.Char ( String )
import Data.Function ( ($) )
import Data.Int ( Int )
import Data.Maybe ( Maybe, fromJust )
import System.IO ( IO, FilePath, readFile )
import Text.Read ( read )
import Prelude.Unicode ( (∘) )
import qualified Data.IntMap as IM ( fromList )
import qualified Data.Map as MP ( fromList )
import qualified Data.IntMap.Unicode as IM ( (∅) )
import Parsimony
import Parsimony.Char ( char, digit )
import System.USB.IDDB.Base ( IDDB(..), getDataFileName )
import System.USB.IDDB.Misc ( eitherMaybe, swap, restOfLine )
parseDb ∷ String → Maybe IDDB
parseDb = eitherMaybe ∘ parse staticDbParser
staticDbParser ∷ Parser String IDDB
staticDbParser = do
vendors ← many vendorParser
return IDDB { dbVendorNameId = MP.fromList $ fmap swap vendors
, dbVendorIdName = IM.fromList vendors
, dbProducts = (IM.∅)
, dbClasses = (IM.∅)
, dbAudioCTType = (IM.∅)
, dbVideoCTType = (IM.∅)
, dbHIDDescType = (IM.∅)
, dbHIDDescItem = (IM.∅)
, dbHIDDescCCode = (IM.∅)
, dbHIDUsage = (IM.∅)
, dbPhysDescBias = (IM.∅)
, dbPhysDescItem = (IM.∅)
, dbLanguages = (IM.∅)
}
where
vendorParser ∷ Parser String (Int, String)
vendorParser = do vid ← many1 digit
char '|'
name ← restOfLine
return (read vid, name)
fromFile ∷ FilePath → IO (Maybe IDDB)
fromFile = fmap parseDb ∘ readFile
staticDbPath ∷ FilePath
staticDbPath = "usb_dot_org_db.txt"
staticDb ∷ IO IDDB
staticDb = getDataFileName staticDbPath >>= fmap fromJust ∘ fromFile
dbURL ∷ String
dbURL = "http://www.usb.org/developers/tools/comp_dump"