packages feed

libmpd-0.2.0: tests/Displayable.hs

module Displayable (Displayable(..)) where

import Network.MPD.Utils
import Network.MPD.Parse

-- | A uniform interface for types that
-- can be turned into raw responses
class Displayable a where
    empty   :: a             -- ^ An empty instance
    display :: a -> String   -- ^ Transform instantiated object to a
                             --   string

instance Displayable Count where
    empty = Count { cSongs = 0, cPlaytime = 0 }
    display s = unlines $
        ["songs: "    ++ show (cSongs s)
        ,"playtime: " ++ show (cPlaytime s)]

instance Displayable Device where
    empty = Device 0 "" False
    display d = unlines $
        ["outputid: "      ++ show (dOutputID d)
        ,"outputname: "    ++ dOutputName d
        ,"outputenabled: " ++ showBool (dOutputEnabled d)]

instance Displayable Song where
    empty = Song { sgArtist = "", sgAlbum = "", sgTitle = "", sgFilePath = ""
                 , sgGenre  = "", sgName  = "", sgComposer = ""
                 , sgPerformer = "", sgLength = 0, sgDate = 0
                 , sgTrack = (0,0), sgDisc = (0,0), sgIndex = Nothing }
    display s = unlines $
        ["file: "      ++ sgFilePath s
        ,"Artist: "    ++ sgArtist s
        ,"Album: "     ++ sgAlbum s
        ,"Title: "     ++ sgTitle s
        ,"Genre: "     ++ sgGenre s
        ,"Name: "      ++ sgName s
        ,"Composer: "  ++ sgComposer s
        ,"Performer: " ++ sgPerformer s
        ,"Date: "      ++ show (sgDate s)
        ,"Track: "     ++ (let (x,y) = sgTrack s in show x++"/"++show y)
        ,"Disc: "      ++ (let (x,y) = sgDisc  s in show x++"/"++show y)
        ,"Time: "      ++ show (sgLength s)]
        ++ maybe [] (\x -> [case x of Pos n -> "Pos: " ++ show n
                                      ID  n -> "Id: "  ++ show n]) (sgIndex s)

instance Displayable Stats where
    empty = Stats { stsArtists = 0, stsAlbums = 0, stsSongs = 0, stsUptime = 0
                  , stsPlaytime = 0, stsDbPlaytime = 0, stsDbUpdate = 0 }
    display s = unlines $
        ["artists: " ++ show (stsArtists s)
        ,"albums: " ++ show (stsAlbums s)
        ,"songs: " ++ show (stsSongs s)
        ,"uptime: " ++ show (stsUptime s)
        ,"playtime: " ++ show (stsPlaytime s)
        ,"db_playtime: " ++ show (stsDbPlaytime s)
        ,"db_update: " ++ show (stsDbUpdate s)]

instance Displayable Status where
    empty = Status { stState = Stopped, stVolume = 0, stRepeat = False
                   , stRandom = False, stPlaylistVersion = 0
                   , stPlaylistLength = 0, stSongPos = Nothing
                   , stSongID = Nothing, stTime = (0, 0), stBitrate = 0
                   , stXFadeWidth = 0, stAudio = (0, 0, 0)
                   , stUpdatingDb = 0, stError = "" }
    display s = unlines $
        ["state: " ++ (case stState s of Playing -> "play"
                                         Paused  -> "pause"
                                         _       -> "stop")
        ,"volume: " ++ show (stVolume s)
        ,"repeat: " ++ showBool (stRepeat s)
        ,"random: " ++ showBool (stRandom s)
        ,"playlist: " ++ show (stPlaylistVersion s)
        ,"playlistlength: " ++ show (stPlaylistLength s)
        ,"xfade: " ++ show (stXFadeWidth s)
        ,"time: " ++ (let (x, y) = stTime s in show x ++ ":" ++ show y)
        ,"bitrate: " ++ show (stBitrate s)
        ,"xfade: " ++ show (stXFadeWidth s)

        ,"audio: " ++ (let (x, y, z) = stAudio s in show x ++ ":" ++ show y ++
                                       ":" ++ show z)
        ,"updating_db: " ++ show (stUpdatingDb s)
        ,"error: " ++ show (stError s)]
        ++ maybe [] (\x -> [case x of Pos n -> "song: " ++ show n
                                      _     -> undefined]) (stSongPos s)
        ++ maybe [] (\x -> [case x of ID n  -> "songid: " ++ show n
                                      _     -> undefined]) (stSongID s)