@@ -5,9 +5,6 @@ module Elm.Constraint
11 , satisfies
8 , satisfies
13 , intersect
10 , intersect
@@ -16,6 +13,8 @@ module Elm.Constraint
16 , untilNextMajor
13 , untilNextMajor
17 , untilNextMinor
14 , untilNextMinor
@@ -24,11 +23,12 @@ module Elm.Constraint
25import Control.Monad (liftM4)
24import Control.Monad (liftM4)
26import Data.Binary (Binary, get, put, getWord8, putWord8)
25import Data.Binary (Binary, get, put, getWord8, putWord8)
27−import qualified Data.Utf8 as Utf8
29import qualified Elm.Version as V
27import qualified Elm.Version as V
30import qualified Json.Decode as D
28import qualified Json.Decode as D
31import qualified Json.Encode as E
29import qualified Json.Encode as E
30+import qualified Parse.Primitives as P
31+import Parse.Primitives (Row, Col)
@@ -61,78 +61,21 @@ anything =
64−-- TO STRING
64+-- TO CHARS
67−toChars :: Constraint -> String
67+toChars :: Constraint -> [Char]
68toChars constraint =
68toChars constraint =
69− Utf8.toChars (toString constraint)
72−toString :: Constraint -> Utf8.String
74 case constraint of
69 case constraint of
75 Range lower lowerOp upperOp upper ->
70 Range lower lowerOp upperOp upper ->
76− Utf8.join 0x20 {- -}
71+ V.toChars lower ++ opToChars lowerOp ++ "v" ++ opToChars upperOp ++ V.toChars upper
78− , toStringHelp lowerOp
80− , toStringHelp upperOp
85−toStringHelp :: Op -> Utf8.String
74+opToChars :: Op -> [Char]
86−toStringHelp op =
75+opToChars op =
87 case op of
76 case op of
88− Less -> "<"
77+ Less -> " < "
89− LessOrEqual -> "<="
78+ LessOrEqual -> " <= "
97− = BadLower Utf8.String
98− | BadUpper Utf8.String
101− | InvalidRange V.Version V.Version
104−fromString :: Utf8.String -> Either Error Constraint
106− case Utf8.split 0x20 {- -} string of
107− [lower, lowerOp, "v", upperOp, upper] ->
108− do lo <- versionFromString lower BadLower
109− lop <- opFromString lowerOp
110− hop <- opFromString upperOp
111− hi <- versionFromString upper BadUpper
113− then Right (Range lo lop hop hi)
114− else Left (InvalidRange lo hi)
120−versionFromString :: Utf8.String -> (Utf8.String -> Error) -> Either Error V.Version
121−versionFromString string toError =
122− case V.fromString string of
127− Left (toError string)
130−opFromString :: Utf8.String -> Either Error Op
133− "<=" -> Right LessOrEqual
@@ -245,18 +188,12 @@ expand constraint@(Range lower lowerOp upperOp upper) version
246encode :: Constraint -> E.Value
189encode :: Constraint -> E.Value
247encode constraint =
190encode constraint =
248− E.string (toString constraint)
191+ E.chars (toChars constraint)
251decoder :: D.Decoder Error Constraint
194decoder :: D.Decoder Error Constraint
253− do str <- D.string
196+ D.customString parser BadFormat
254− case fromString str of
@@ -279,4 +216,45 @@ instance Binary Op where
279 case n of
216 case n of
280 0 -> return Less
217 0 -> return Less
281 1 -> return LessOrEqual
218 1 -> return LessOrEqual
282− _ -> error "binary encoding of Op was corrupted"
219+ _ -> error "binary encoding of Op was corrupted"
228+ | InvalidRange V.Version V.Version
231+parser :: P.Parser Error Constraint
233+ do lower <- parseVersion
234+ P.word1 0x20 {- -} BadFormat
236+ P.word1 0x20 {- -} BadFormat
237+ P.word1 0x76 {-v-} BadFormat
238+ P.word1 0x20 {- -} BadFormat
240+ P.word1 0x20 {- -} BadFormat
241+ higher <- parseVersion
242+ P.Parser $ \state@(P.State _ _ _ _ row col) _ eok _ eerr ->
244+ then eok (Range lower loOp hiOp higher) state
245+ else eerr row col (\_ _ -> InvalidRange lower higher)
248+parseVersion :: P.Parser Error V.Version
250+ P.specialize (\(r,c) _ _ -> BadFormat r c) V.parser
253+parseOp :: P.Parser Error Op
255+ do P.word1 0x3C {-<-} BadFormat
257+ [ do P.word1 0x3D {-=-} BadFormat