@@ -3,7 +3,6 @@ module Data.Schematic.Validation where
33import Control.Monad
44import Control.Monad.Validation
55import Data.Aeson
6−import Data.Aeson.Internal
76import Data.Aeson.Types
87import Data.Foldable
98import Data.Functor.Identity
@@ -50,51 +49,51 @@ isValidationError (ValidationError _) = True
5049isValidationError _ = False
5150
5251validateTextConstraint
53− :: JSONPathText
52+ :: JSONPath
5453 -> Text
5554 -> Sing (tcs :: TextConstraint)
5655 -> Validation ()
57−validateTextConstraint (JSONPathText path) t = \case
56+validateTextConstraint (JSONPath path) t = \case
5857 STEq n -> do
5958 let
6059 nlen = withKnownNat n $ natVal n
6160 predicate = nlen == (fromIntegral $ T.length t)
62− errMsg = "length should be == " <> T.pack (show nlen)
61+ errMsg = "length of " <> path <> " should be == " <> T.pack (show nlen)
6362 warn = vWarning $ mmSingleton path (pure errMsg)
6463 unless predicate warn
6564 STLt n -> do
6665 let
6766 nlen = withKnownNat n $ natVal n
6867 predicate = nlen > (fromIntegral $ T.length t)
69− errMsg = "length should be < " <> T.pack (show nlen)
68+ errMsg = "length of " <> path <> " should be < " <> T.pack (show nlen)
7069 warn = vWarning $ mmSingleton path (pure errMsg)
7170 unless predicate warn
7271 STLe n -> do
7372 let
7473 nlen = withKnownNat n $ natVal n
7574 predicate = nlen >= (fromIntegral $ T.length t)
76− errMsg = "length should be <= " <> T.pack (show nlen)
75+ errMsg = "length of " <> path <> " should be <= " <> T.pack (show nlen)
7776 warn = vWarning $ mmSingleton path (pure errMsg)
7877 unless predicate warn
7978 STGt n -> do
8079 let
8180 nlen = withKnownNat n $ natVal n
8281 predicate = nlen < (fromIntegral $ T.length t)
83− errMsg = "length should be > " <> T.pack (show nlen)
82+ errMsg = "length of " <> path <> " should be > " <> T.pack (show nlen)
8483 warn = vWarning $ mmSingleton path (pure errMsg)
8584 unless predicate warn
8685 STGe n -> do
8786 let
8887 nlen = withKnownNat n $ natVal n
8988 predicate = nlen <= (fromIntegral $ T.length t)
90− errMsg = "length should be >= " <> T.pack (show nlen)
89+ errMsg = "length of " <> path <> " should be >= " <> T.pack (show nlen)
9190 warn = vWarning $ mmSingleton path (pure errMsg)
9291 unless predicate warn
9392 STRegex r -> do
9493 let
9594 regex = withKnownSymbol r $ fromSing r
9695 predicate = matchTest (makeRegex (T.unpack regex) :: Regex) (T.unpack t)
97− errMsg = "must match " <> regex
96+ errMsg = path <> " must match " <> regex
9897 warn = vWarning $ mmSingleton path (pure errMsg)
9998 unless predicate warn
10099 STEnum ss -> do
@@ -102,97 +101,69 @@ validateTextConstraint (JSONPathText path) t = \case
102101 matching :: Sing (s :: [Symbol]) -> Bool
103102 matching SNil = False
104103 matching (SCons s@SSym fs) = T.pack (symbolVal s) == t || matching fs
105− errMsg = "must be one of " <> T.pack (show (fromSing ss))
104+ errMsg = path <> " must be one of " <> T.pack (show (fromSing ss))
106105 warn = vWarning $ mmSingleton path (pure errMsg)
107106 unless (matching ss) warn
108107
109108validateNumberConstraint
110− :: JSONPathText
109+ :: JSONPath
111110 -> Scientific
112111 -> Sing (tcs :: NumberConstraint)
113112 -> Validation ()
114−validateNumberConstraint (JSONPathText path) num = \case
113+validateNumberConstraint (JSONPath path) num = \case
115114 SNEq n -> do
116115 let
117116 nlen = withKnownNat n $ natVal n
118117 predicate = fromIntegral nlen == num
119− errMsg = "should be == " <> T.pack (show nlen)
118+ errMsg = path <> " should be == " <> T.pack (show nlen)
120119 warn = vWarning $ mmSingleton path (pure errMsg)
121120 unless predicate warn
122121 SNGt n -> do
123122 let
124123 nlen = withKnownNat n $ natVal n
125124 predicate = num > fromIntegral nlen
126− errMsg = "should be > " <> T.pack (show nlen)
125+ errMsg = path <> " should be > " <> T.pack (show nlen)
127126 warn = vWarning $ mmSingleton path (pure errMsg)
128127 unless predicate warn
129128 SNGe n -> do
130129 let
131130 nlen = withKnownNat n $ natVal n
132131 predicate = num >= fromIntegral nlen
133− errMsg = "should be >= " <> T.pack (show nlen)
132+ errMsg = path <> " should be >= " <> T.pack (show nlen)
134133 warn = vWarning $ mmSingleton path (pure errMsg)
135134 unless predicate warn
136135 SNLt n -> do
137136 let
138137 nlen = withKnownNat n $ natVal n
139138 predicate = num < fromIntegral nlen
140− errMsg = "should be < " <> T.pack (show nlen)
139+ errMsg = path <> " should be < " <> T.pack (show nlen)
141140 warn = vWarning $ mmSingleton path (pure errMsg)
142141 unless predicate warn
143142 SNLe n -> do
144143 let
145144 nlen = withKnownNat n $ natVal n
146145 predicate = num <= fromIntegral nlen
147− errMsg = "should be <= " <> T.pack (show nlen)
146+ errMsg = path <> " should be <= " <> T.pack (show nlen)
148147 warn = vWarning $ mmSingleton path (pure errMsg)
149148 unless predicate warn
150149
151150validateArrayConstraint
152− :: JSONPathText
151+ :: JSONPath
153152 -> V.Vector a
154153 -> Sing (tcs :: ArrayConstraint)
155154 -> Validation ()
156−validateArrayConstraint (JSONPathText path) v = \case
155+validateArrayConstraint (JSONPath path) v = \case
157156 SAEq n -> do
158157 let
159158 nlen = withKnownNat n $ natVal n
160159 predicate = nlen == fromIntegral (V.length v)
161− errMsg = "length should be == " <> T.pack (show nlen)
162− warn = vWarning $ mmSingleton path (pure errMsg)
163− unless predicate warn
164− SAGt n -> do
165− let
166− nlen = withKnownNat n $ natVal n
167− predicate = fromIntegral (V.length v) > nlen
168− errMsg = "length should be > " <> T.pack (show nlen)
169− warn = vWarning $ mmSingleton path (pure errMsg)
170− unless predicate warn
171− SAGe n -> do
172− let
173− nlen = withKnownNat n $ natVal n
174− predicate = fromIntegral (V.length v) >= nlen
175− errMsg = "length should be >= " <> T.pack (show nlen)
176− warn = vWarning $ mmSingleton path (pure errMsg)
177− unless predicate warn
178− SALt n -> do
179− let
180− nlen = withKnownNat n $ natVal n
181− predicate = fromIntegral (V.length v) < nlen
182− errMsg = "length should be < " <> T.pack (show nlen)
183− warn = vWarning $ mmSingleton path (pure errMsg)
184− unless predicate warn
185− SALe n -> do
186− let
187− nlen = withKnownNat n $ natVal n
188− predicate = fromIntegral (V.length v) <= nlen
189− errMsg = "length should be <= " <> T.pack (show nlen)
160+ errMsg = "length of " <> path <> " should be == " <> T.pack (show nlen)
190161 warn = vWarning $ mmSingleton path (pure errMsg)
191162 unless predicate warn
192163
193164validateJsonRepr
194165 :: Sing schema
195− -> JSONPath
166+ -> [DemotedPathSegment]
196167 -> JsonRepr schema
197168 -> Validation ()
198169validateJsonRepr sschema dpath jr = case jr of
@@ -226,7 +197,7 @@ validateJsonRepr sschema dpath jr = case jr of
226197 process cs
227198 process acs
228199 for_ (V.indexed v) $ \(ix, jr') -> do
229− let newPath = dpath <> pure (Index $ fromIntegral ix)
200+ let newPath = dpath <> pure (DIx $ fromIntegral ix)
230201 validateJsonRepr s newPath jr'
231202 ReprOptional d -> case sschema of
232203 SSchemaOptional ss -> case d of
@@ -238,7 +209,7 @@ validateJsonRepr sschema dpath jr = case jr of
238209 go :: Rec FieldRepr (ts :: [(Symbol, Schema)] ) -> Validation ()
239210 go RNil = pure ()
240211 go (f@(FieldRepr d) :& ftl) = do
241− let newPath = dpath <> [Key (knownFieldName f)]
212+ let newPath = dpath <> [DKey (knownFieldName f)]
242213 validateJsonRepr (knownFieldSchema f) newPath d
243214 go ftl
244215 ReprUnion _ -> pure () -- FIXME
@@ -250,7 +221,7 @@ validateJsonRepr sschema dpath jr = case jr of
250221 -- fail "impossible to produce subUnion, please report this as a bug"
251222 -- Just x -> do
252223 -- let
253− -- JSONPathText path = demotedPathToText dpath
224+ -- JSONPath path = demotedPathToText dpath
254225 -- case stl of
255226 -- SNil -> void $ vWarning $ mmSingleton path
256227 -- $ pure "union handling error, please report this as bug"