diff options
Diffstat (limited to 'src/Network/KRPC/Scheme.hs')
-rw-r--r-- | src/Network/KRPC/Scheme.hs | 80 |
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 #-} | ||
17 | module Remote.KRPC.Scheme | ||
18 | ( KMessage(..) | ||
19 | , KQueryScheme(..), methodQueryScheme | ||
20 | , KResponseScheme(..), methodRespScheme | ||
21 | ) where | ||
22 | |||
23 | import Control.Applicative | ||
24 | import Data.Map as M | ||
25 | import Data.Set as S | ||
26 | |||
27 | import Remote.KRPC.Protocol | ||
28 | import Remote.KRPC | ||
29 | |||
30 | |||
31 | -- | Used to validate any message by its scheme | ||
32 | -- | ||
33 | -- forall m. m `validate` scheme m | ||
34 | -- | ||
35 | class 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 | |||
47 | instance KMessage KError ErrorCode where | ||
48 | {-# SPECIALIZE instance KMessage KError ErrorCode #-} | ||
49 | scheme = errorCode | ||
50 | {-# INLINE scheme #-} | ||
51 | |||
52 | |||
53 | data KQueryScheme = KQueryScheme { | ||
54 | qscMethod :: MethodName | ||
55 | , qscParams :: Set ParamName | ||
56 | } deriving (Show, Read, Eq, Ord) | ||
57 | |||
58 | instance KMessage KQuery KQueryScheme where | ||
59 | {-# SPECIALIZE instance KMessage KQuery KQueryScheme #-} | ||
60 | scheme q = KQueryScheme (queryMethod q) (M.keysSet (queryArgs q)) | ||
61 | {-# INLINE scheme #-} | ||
62 | |||
63 | methodQueryScheme :: Method a b -> KQueryScheme | ||
64 | methodQueryScheme = KQueryScheme <$> methodName | ||
65 | <*> S.fromList . methodParams | ||
66 | {-# INLINE methodQueryScheme #-} | ||
67 | |||
68 | |||
69 | newtype KResponseScheme = KResponseScheme { | ||
70 | rscVals :: Set ValName | ||
71 | } deriving (Show, Read, Eq, Ord) | ||
72 | |||
73 | instance KMessage KResponse KResponseScheme where | ||
74 | {-# SPECIALIZE instance KMessage KResponse KResponseScheme #-} | ||
75 | scheme = KResponseScheme . keysSet . respVals | ||
76 | {-# INLINE scheme #-} | ||
77 | |||
78 | methodRespScheme :: Method a b -> KResponseScheme | ||
79 | methodRespScheme = KResponseScheme . S.fromList . methodVals | ||
80 | {-# INLINE methodRespScheme #-} | ||