module Network.KRPC.Scheme
( KMessage(..)
, KQueryScheme(..), methodQueryScheme
, KResponseScheme(..), methodRespScheme
) where
import Control.Applicative
import Data.BEncode.BDict as BS
import Data.BEncode.Types as BS
import Network.KRPC.Protocol
import Network.KRPC
class KMessage message scheme | message -> scheme where
scheme :: message -> scheme
validate :: message -> scheme -> Bool
default validate :: Eq scheme => message -> scheme -> Bool
validate = (==) . scheme
instance KMessage KError ErrorCode where
scheme = errorCode
data KQueryScheme = KQueryScheme {
qscMethod :: MethodName
, qscParams :: [ParamName]
} deriving (Show, Read, Eq, Ord)
bdictKeys :: BDict -> [BKey]
bdictKeys (Cons k _ xs) = k : bdictKeys xs
bdictKeys Nil = []
instance KMessage KQuery KQueryScheme where
scheme q = KQueryScheme
{ qscMethod = queryMethod q
, qscParams = bdictKeys $ queryArgs q
}
methodQueryScheme :: Method a b -> KQueryScheme
methodQueryScheme = KQueryScheme <$> methodName <*> methodParams
newtype KResponseScheme = KResponseScheme
{ rscVals :: [ValName]
} deriving (Show, Read, Eq, Ord)
instance KMessage KResponse KResponseScheme where
scheme = KResponseScheme . bdictKeys . respVals
methodRespScheme :: Method a b -> KResponseScheme
methodRespScheme = KResponseScheme . methodVals