1- {-# LANGUAGE CPP #-}
21module Data.Schematic.Validation where
32
43import Control.Monad
@@ -7,6 +6,7 @@ import Data.Aeson
76import Data.Aeson.Types
87import Data.Foldable
98import Data.Functor.Identity
9+ import Data.Monoid ((<>) )
1010import Data.Schematic.Constraints
1111import Data.Schematic.Path
1212import Data.Schematic.Schema
@@ -17,12 +17,8 @@ import Data.Traversable
1717import Data.Union
1818import Data.Vector as V
1919import Data.Vinyl
20- import Data.Vinyl.TypeLevel
2120import Prelude as P
2221import Text.Regex.TDFA
23- #if !MIN_VERSION_base(4,11,0)
24- import Data.Monoid ((<>) )
25- #endif
2622
2723
2824type Validation a = ValidationT ErrorMap Identity a
@@ -104,41 +100,41 @@ validateArrayConstraint (JSONPath path) v s =
104100 $ vWarning $ mmSingleton path $ pure
105101 $ " length of " <> path <> " should be == " <> T. pack (show n)
106102
103+ class ValidateConstraint t c where
104+ validateConstraint
105+ :: [DemotedPathSegment ] -> t -> Sing (a :: c ) -> Validation ()
106+
107+ instance ValidateConstraint Text TextConstraint where
108+ validateConstraint = validateTextConstraint . demotedPathToText
109+
110+ instance ValidateConstraint Scientific NumberConstraint where
111+ validateConstraint = validateNumberConstraint . demotedPathToText
112+
113+ instance ValidateConstraint (V. Vector a ) ArrayConstraint where
114+ validateConstraint = validateArrayConstraint . demotedPathToText
115+
116+ validateConstraints
117+ :: ValidateConstraint t c
118+ => [DemotedPathSegment ] -> t -> Sing (cs :: [c ]) -> Validation ()
119+ validateConstraints _ _ SNil = pure ()
120+ validateConstraints dp t (SCons c cs) = do
121+ validateConstraint dp t c >> validateConstraints dp t cs
122+
107123validateJsonRepr
108124 :: Sing schema
109125 -> [DemotedPathSegment ]
110126 -> JsonRepr schema
111127 -> Validation ()
112128validateJsonRepr sschema dpath jr = case jr of
113129 ReprText t -> case sschema of
114- SSchemaText scs -> do
115- let
116- process :: Sing (cs :: [TextConstraint ]) -> Validation ()
117- process SNil = pure ()
118- process (SCons c cs) = do
119- validateTextConstraint (demotedPathToText dpath) t c
120- process cs
121- process scs
130+ SSchemaText scs -> validateConstraints dpath t scs
122131 ReprNumber n -> case sschema of
123- SSchemaNumber scs -> do
124- let
125- process :: Sing (cs :: [NumberConstraint ]) -> Validation ()
126- process SNil = pure ()
127- process (SCons c cs) = do
128- validateNumberConstraint (demotedPathToText dpath) n c
129- process cs
130- process scs
132+ SSchemaNumber scs -> validateConstraints dpath n scs
131133 ReprNull -> pure ()
132134 ReprBoolean _ -> pure ()
133135 ReprArray v -> case sschema of
134136 SSchemaArray acs s -> do
135- let
136- process :: Sing (cs :: [ArrayConstraint ]) -> Validation ()
137- process SNil = pure ()
138- process (SCons c cs) = do
139- validateArrayConstraint (demotedPathToText dpath) v c
140- process cs
141- process acs
137+ validateConstraints dpath v acs
142138 for_ (V. indexed v) $ \ (ix, jr') -> do
143139 let newPath = dpath <> pure (Ix $ fromIntegral ix)
144140 validateJsonRepr s newPath jr'
@@ -155,46 +151,17 @@ validateJsonRepr sschema dpath jr = case jr of
155151 let newPath = dpath <> [Key (knownFieldName f)]
156152 validateJsonRepr (knownFieldSchema f) newPath d
157153 go ftl
158- ReprUnion _ -> pure () -- FIXME
159- -- case sschema of
160- -- SSchemaUnion ss -> case ss of
161- -- SCons s stl -> case umatch' s u of
162- -- Nothing -> case urestrict u of
163- -- Nothing ->
164- -- fail "impossible to produce subUnion, please report this as a bug"
165- -- Just x -> do
166- -- let
167- -- JSONPath path = demotedPathToText dpath
168- -- case stl of
169- -- SNil -> void $ vWarning $ mmSingleton path
170- -- $ pure "union handling error, please report this as bug"
171- -- SCons s' stl' ->
172- -- validateJsonRepr (SSchemaUnion (SCons s' stl')) dpath
173- -- $ toUnion (SCons s' stl') x
174- -- Just x -> validateJsonRepr s dpath x
175-
176- -- subUnion
177- -- :: Sing (s ': stl)
178- -- -> ( USubset stl (s ': stl) (RImage stl (s ': stl))
179- -- => Union f (s ': stl)
180- -- -> Maybe (Union f stl) )
181- -- subUnion (SCons s stl) = urestrict
182-
183- -- withUSubset
184- -- :: Sing (s ': stl)
185- -- -> (USubset stl (s ': stl) (RImage stl (s ': stl)) => Maybe (Union f stl))
186- -- -> Maybe (Union f stl)
187- -- withUSubset (SCons s stl) r = r
188-
189- toUnion
190- :: (USubset s' (s ': ss ) (RImage s' (s ': ss )), ReprUnionConstr ss )
191- => Sing (s ': ss )
192- -> Union JsonRepr s'
193- -> JsonRepr ('SchemaUnion (s ': ss ))
194- toUnion _ = ReprUnion . urelax
195-
196- umatch' :: UElem a as i => Sing a -> Union f as -> Maybe (f a )
197- umatch' _ u = umatch u
154+ ReprUnion ru -> -- pure () -- FIXME
155+ case sschema of
156+ SSchemaUnion su -> validateUnion su ru
157+ where
158+ validateUnion
159+ :: forall (us :: [Schema ])
160+ . Sing us -> Union JsonRepr us -> Validation ()
161+ validateUnion ss r = case (ss,r) of
162+ (SCons (s :: Sing su ) _, This v) -> validateJsonRepr s dpath v
163+ (SCons _ stl, That r') -> validateUnion stl r'
164+ (SNil ,_) -> fail " Invalid union. Please report this as a bug"
198165
199166parseAndValidateJson
200167 :: forall schema
@@ -211,10 +178,3 @@ parseAndValidateJson v =
211178 in case res of
212179 Left em -> ValidationError em
213180 Right () -> Valid jsonRepr
214-
215- -- parseAndValidateJsonBy
216- -- :: (FromJSON (JsonRepr schema), TopLevel schema, SingI schema)
217- -- => proxy schema
218- -- -> Value
219- -- -> ParseResult (JsonRepr schema)
220- -- parseAndValidateJsonBy _ = parseAndValidateJson
0 commit comments