module Network.MPD.Parse
( getStatusField
, getStatusFieldElement
, getTag
, processSong
, maybePathCurrentSong
, maybePathNextPlaylistSong
, headMay
, valueToStringMay
, (.=?)
, objectJson
, getStatusIdInt
) where
import qualified Network.MPD as MPD
import Network.MPD
( Metadata(..), Song, PlaybackState(Stopped, Playing, Paused) )
import Data.Aeson ( object, Key, KeyValue(..), ToJSON, Value )
import Data.Aeson.Types ( Pair )
import Data.Maybe ( catMaybes, fromMaybe )
getStatusField :: MPD.Response MPD.Status -> (MPD.Status -> a) -> Maybe a
getStatusField :: forall a. Response Status -> (Status -> a) -> Maybe a
getStatusField (Right Status
st) Status -> a
f = a -> Maybe a
forall a. a -> Maybe a
Just (Status -> a
f Status
st)
getStatusField Response Status
_ Status -> a
_ = Maybe a
forall a. Maybe a
Nothing
getStatusFieldElement :: MPD.Response MPD.Status -> (MPD.Status -> Maybe a) -> Maybe a
getStatusFieldElement :: forall a. Response Status -> (Status -> Maybe a) -> Maybe a
getStatusFieldElement Response Status
status Status -> Maybe a
item = Maybe a -> Maybe (Maybe a) -> Maybe a
forall a. a -> Maybe a -> a
fromMaybe Maybe a
forall a. Maybe a
Nothing (Maybe (Maybe a) -> Maybe a) -> Maybe (Maybe a) -> Maybe a
forall a b. (a -> b) -> a -> b
$ Response Status -> (Status -> Maybe a) -> Maybe (Maybe a)
forall a. Response Status -> (Status -> a) -> Maybe a
getStatusField Response Status
status Status -> Maybe a
item
getTag :: Metadata -> Either a (Maybe Song) -> Maybe String
getTag :: forall a. Metadata -> Either a (Maybe Song) -> Maybe String
getTag Metadata
t Either a (Maybe Song)
c =
case Either a (Maybe Song)
c of
Left a
_ -> Maybe String
forall a. Maybe a
Nothing
Right Maybe Song
song -> Metadata -> Maybe Song -> Maybe String
processSong Metadata
t Maybe Song
song
processSong :: Metadata -> Maybe Song -> Maybe String
processSong :: Metadata -> Maybe Song -> Maybe String
processSong Metadata
_ Maybe Song
Nothing = Maybe String
forall a. Maybe a
Nothing
processSong Metadata
tag (Just Song
song) = do
let tagVal :: Maybe [Value]
tagVal = Metadata -> Song -> Maybe [Value]
MPD.sgGetTag Metadata
tag Song
song
Value -> Maybe String
valueToStringMay (Value -> Maybe String) -> Maybe Value -> Maybe String
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< ([Value] -> Maybe Value
forall a. [a] -> Maybe a
headMay ([Value] -> Maybe Value) -> Maybe [Value] -> Maybe Value
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Maybe [Value]
tagVal)
maybePathCurrentSong :: MPD.Response (Maybe Song) -> Maybe String
maybePathCurrentSong :: Response (Maybe Song) -> Maybe String
maybePathCurrentSong Response (Maybe Song)
cs =
case Response (Maybe Song)
cs of
Left MPDError
_ -> Maybe String
forall a. Maybe a
Nothing
Right Maybe Song
Nothing -> Maybe String
forall a. Maybe a
Nothing
Right (Just Song
song) -> String -> Maybe String
forall a. a -> Maybe a
Just (String -> Maybe String) -> String -> Maybe String
forall a b. (a -> b) -> a -> b
$ Path -> String
forall a. ToString a => a -> String
MPD.toString (Path -> String) -> Path -> String
forall a b. (a -> b) -> a -> b
$ Song -> Path
MPD.sgFilePath Song
song
maybePathNextPlaylistSong :: MPD.Response [Song] -> Maybe String
maybePathNextPlaylistSong :: Response [Song] -> Maybe String
maybePathNextPlaylistSong (Left MPDError
_) = Maybe String
forall a. Maybe a
Nothing
maybePathNextPlaylistSong (Right []) = Maybe String
forall a. Maybe a
Nothing
maybePathNextPlaylistSong (Right (Song
_:Song
_:[Song]
_)) = Maybe String
forall a. Maybe a
Nothing
maybePathNextPlaylistSong (Right [Song
s]) = String -> Maybe String
forall a. a -> Maybe a
Just (String -> Maybe String) -> String -> Maybe String
forall a b. (a -> b) -> a -> b
$ Path -> String
forall a. ToString a => a -> String
MPD.toString (Path -> String) -> Path -> String
forall a b. (a -> b) -> a -> b
$ Song -> Path
MPD.sgFilePath Song
s
headMay :: [a] -> Maybe a
headMay :: forall a. [a] -> Maybe a
headMay [] = Maybe a
forall a. Maybe a
Nothing
headMay (a
x:[a]
_) = a -> Maybe a
forall a. a -> Maybe a
Just a
x
valueToStringMay :: MPD.Value -> Maybe String
valueToStringMay :: Value -> Maybe String
valueToStringMay Value
x = String -> Maybe String
forall a. a -> Maybe a
Just (Value -> String
forall a. ToString a => a -> String
MPD.toString Value
x)
(.=?) :: (KeyValue e a, ToJSON v) => Key -> Maybe v -> Maybe a
Key
key .=? :: forall e a v. (KeyValue e a, ToJSON v) => Key -> Maybe v -> Maybe a
.=? Just v
value = a -> Maybe a
forall a. a -> Maybe a
Just (Key
key Key -> v -> a
forall v. ToJSON v => Key -> v -> a
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= v
value)
Key
_ .=? Maybe v
Nothing = Maybe a
forall a. Maybe a
Nothing
objectJson :: [Maybe Pair] -> Value
objectJson :: [Maybe Pair] -> Value
objectJson = [Pair] -> Value
object ([Pair] -> Value)
-> ([Maybe Pair] -> [Pair]) -> [Maybe Pair] -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Maybe Pair] -> [Pair]
forall a. [Maybe a] -> [a]
catMaybes
getStatusIdInt :: (MPD.Status -> Maybe MPD.Id) -> Either MPD.MPDError MPD.Status -> Maybe Int
getStatusIdInt :: (Status -> Maybe Id) -> Response Status -> Maybe Int
getStatusIdInt Status -> Maybe Id
item Response Status
status =
case Maybe Id
m of
Just (MPD.Id Int
int) -> Int -> Maybe Int
forall a. a -> Maybe a
Just Int
int
Maybe Id
Nothing -> Maybe Int
forall a. Maybe a
Nothing
where
m :: Maybe Id
m = Maybe Id -> Maybe (Maybe Id) -> Maybe Id
forall a. a -> Maybe a -> a
fromMaybe Maybe Id
forall a. Maybe a
Nothing (Maybe (Maybe Id) -> Maybe Id) -> Maybe (Maybe Id) -> Maybe Id
forall a b. (a -> b) -> a -> b
$ Response Status -> (Status -> Maybe Id) -> Maybe (Maybe Id)
forall a. Response Status -> (Status -> a) -> Maybe a
getStatusField Response Status
status Status -> Maybe Id
item