summaryrefslogtreecommitdiff
path: root/src/Network/KRPC/Scheme.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Network/KRPC/Scheme.hs')
-rw-r--r--src/Network/KRPC/Scheme.hs80
1 files changed, 80 insertions, 0 deletions
diff --git a/src/Network/KRPC/Scheme.hs b/src/Network/KRPC/Scheme.hs
new file mode 100644
index 00000000..ebdc7740
--- /dev/null
+++ b/src/Network/KRPC/Scheme.hs
@@ -0,0 +1,80 @@
1-- |
2-- Copyright : (c) Sam Truzjan 2013
3-- License : BSD3
4-- Maintainer : pxqr.sta@gmail.com
5-- Stability : experimental
6-- Portability : portable
7--
8-- This module provides message scheme validation for core protocol
9-- messages from 'Remote.KRPC.Procotol'. This module should be used
10-- with 'Remote.KRPC.Protocol', otherwise (if you are using 'Remote.KRPC')
11-- this module seems to be useless.
12--
13{-# LANGUAGE DefaultSignatures #-}
14{-# LANGUAGE TypeSynonymInstances #-}
15{-# LANGUAGE MultiParamTypeClasses #-}
16{-# LANGUAGE FunctionalDependencies #-}
17module Remote.KRPC.Scheme
18 ( KMessage(..)
19 , KQueryScheme(..), methodQueryScheme
20 , KResponseScheme(..), methodRespScheme
21 ) where
22
23import Control.Applicative
24import Data.Map as M
25import Data.Set as S
26
27import Remote.KRPC.Protocol
28import Remote.KRPC
29
30
31-- | Used to validate any message by its scheme
32--
33-- forall m. m `validate` scheme m
34--
35class KMessage message scheme | message -> scheme where
36 -- | Get a message scheme.
37 scheme :: message -> scheme
38
39 -- | Check a message with a scheme.
40 validate :: message -> scheme -> Bool
41
42 default validate :: Eq scheme => message -> scheme -> Bool
43 validate = (==) . scheme
44 {-# INLINE validate #-}
45
46
47instance KMessage KError ErrorCode where
48 {-# SPECIALIZE instance KMessage KError ErrorCode #-}
49 scheme = errorCode
50 {-# INLINE scheme #-}
51
52
53data KQueryScheme = KQueryScheme {
54 qscMethod :: MethodName
55 , qscParams :: Set ParamName
56 } deriving (Show, Read, Eq, Ord)
57
58instance KMessage KQuery KQueryScheme where
59 {-# SPECIALIZE instance KMessage KQuery KQueryScheme #-}
60 scheme q = KQueryScheme (queryMethod q) (M.keysSet (queryArgs q))
61 {-# INLINE scheme #-}
62
63methodQueryScheme :: Method a b -> KQueryScheme
64methodQueryScheme = KQueryScheme <$> methodName
65 <*> S.fromList . methodParams
66{-# INLINE methodQueryScheme #-}
67
68
69newtype KResponseScheme = KResponseScheme {
70 rscVals :: Set ValName
71 } deriving (Show, Read, Eq, Ord)
72
73instance KMessage KResponse KResponseScheme where
74 {-# SPECIALIZE instance KMessage KResponse KResponseScheme #-}
75 scheme = KResponseScheme . keysSet . respVals
76 {-# INLINE scheme #-}
77
78methodRespScheme :: Method a b -> KResponseScheme
79methodRespScheme = KResponseScheme . S.fromList . methodVals
80{-# INLINE methodRespScheme #-}