@@ -1,12 +1,13 @@
1{-# OPTIONS_GHC -Wall #-}
1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE OverloadedStrings #-}
3−module Elm.Project.Constraint
3+module Elm.Constraint
4 ( Constraint
4 ( Constraint
7− , fromText
7+ , toChars
9− , toText
9+ , Error(..)
10 , satisfies
11 , satisfies
12 , intersect
13 , intersect
@@ -15,18 +16,19 @@ module Elm.Project.Constraint
15 , untilNextMajor
16 , untilNextMajor
16 , untilNextMinor
17 , untilNextMinor
22import Control.Monad (liftM4)
25import Control.Monad (liftM4)
23−import Data.Binary
26+import Data.Binary (Binary, get, put, getWord8, putWord8)
24−import qualified Data.Text as Text
27+import qualified Data.Utf8 as Utf8
25−import Data.Text (Text)
27−import qualified Elm.Compiler as Compiler
29+import qualified Elm.Version as V
28−import qualified Elm.Package as Pkg
30+import qualified Json.Decode as D
29−import Elm.Package (Version(..))
31+import qualified Json.Encode as E
@@ -34,7 +36,7 @@ import Elm.Package (Version(..))
36data Constraint
38data Constraint
37− = Range Version Op Op Version
39+ = Range V.Version Op Op V.Version
38 deriving (Eq)
40 deriving (Eq)
@@ -48,96 +50,96 @@ data Op
48-- COMMON CONSTRAINTS
50-- COMMON CONSTRAINTS
51−exactly :: Version -> Constraint
53+exactly :: V.Version -> Constraint
52exactly version =
54exactly version =
53 Range version LessOrEqual LessOrEqual version
55 Range version LessOrEqual LessOrEqual version
56anything :: Constraint
58anything :: Constraint
58− Range (Version 1 0 0) LessOrEqual LessOrEqual (Version maxBound 0 0)
60+ Range V.one LessOrEqual LessOrEqual V.max
62−-- TEXT CONVERSION
64+-- TO STRING
65−toString :: Constraint -> String
67+toChars :: Constraint -> String
66−toString constraint =
68+toChars constraint =
67− Text.unpack (toText constraint)
69+ Utf8.toChars (toString constraint)
70−toText :: Constraint -> Text
72+toString :: Constraint -> Utf8.String
71−toText constraint =
73+toString constraint =
72 case constraint of
74 case constraint of
73 Range lower lowerOp upperOp upper ->
75 Range lower lowerOp upperOp upper ->
74− Text.intercalate " "
76+ Utf8.join 0x20 {- -}
75− [ Pkg.versionToText lower
77+ [ V.toString lower
76− , opToText lowerOp
78+ , toStringHelp lowerOp
78− , opToText upperOp
80+ , toStringHelp upperOp
79− , Pkg.versionToText upper
81+ , V.toString upper
83−opToText :: Op -> Text
85+toStringHelp :: Op -> Utf8.String
84−opToText op =
86+toStringHelp op =
85 case op of
87 case op of
86− Less ->
88+ Less -> "<"
87− "<"
89+ LessOrEqual -> "<="
97+ = BadLower Utf8.String
98+ | BadUpper Utf8.String
101+ | InvalidRange V.Version V.Version
93−fromText :: Text -> Either String Constraint
104+fromString :: Utf8.String -> Either Error Constraint
94−fromText text =
105+fromString string =
95− case Text.splitOn " " text of
106+ case Utf8.split 0x20 {- -} string of
96 [lower, lowerOp, "v", upperOp, upper] ->
107 [lower, lowerOp, "v", upperOp, upper] ->
97− do lo <- versionFromText "lower" lower
108+ do lo <- versionFromString lower BadLower
98− lop <- opFromText lowerOp
109+ lop <- opFromString lowerOp
99− hop <- opFromText upperOp
110+ hop <- opFromString upperOp
100− hi <- versionFromText "upper" upper
111+ hi <- versionFromString upper BadUpper
101 if lo < hi
112 if lo < hi
102 then Right (Range lo lop hop hi)
113 then Right (Range lo lop hop hi)
103− else
114+ else Left (InvalidRange lo hi)
105− "The lower bound (" ++ Text.unpack lower
106− ++ ") must be less than the upper bound ("
107− ++ Text.unpack upper ++ ")"
110− Left "The standard format is \"1.0.0 <= v < 2.0.0\""
117+ Left BadFormat
113−versionFromText :: String -> Text -> Either String Version
120+versionFromString :: Utf8.String -> (Utf8.String -> Error) -> Either Error V.Version
114−versionFromText lowerOrUpper text =
121+versionFromString string toError =
115− case Pkg.versionFromText text of
122+ case V.fromString string of
116 Just vsn ->
123 Just vsn ->
117 Right vsn
124 Right vsn
119 Nothing ->
126 Nothing ->
120− Left $ "The " ++ lowerOrUpper ++ " bound (" ++ Text.unpack text ++ ") is not a valid version number."
127+ Left (toError string)
123−opFromText :: Text -> Either String Op
130+opFromString :: Utf8.String -> Either Error Op
124−opFromText text =
131+opFromString text =
125 case text of
132 case text of
127− Right LessOrEqual
133+ "<=" -> Right LessOrEqual
130− Right Less
134+ "<" -> Right Less
131−
135+ _ -> Left InvalidOp
133− Left $ "The operator (" ++ Text.unpack text ++ ") is not valid. Must be (<=) or (<)."
137-- IS SATISFIED
139-- IS SATISFIED
140−satisfies :: Constraint -> Version -> Bool
142+satisfies :: Constraint -> V.Version -> Bool
141satisfies constraint version =
143satisfies constraint version =
142 case constraint of
144 case constraint of
143 Range lower lowerOp upperOp upper ->
145 Range lower lowerOp upperOp upper ->
@@ -156,7 +158,7 @@ isLess op =
159−check :: Constraint -> Version -> Ordering
161+check :: Constraint -> V.Version -> Ordering
160check constraint version =
162check constraint version =
161 case constraint of
163 case constraint of
162 Range lower lowerOp upperOp upper ->
164 Range lower lowerOp upperOp upper ->
@@ -201,43 +203,63 @@ intersect (Range lo lop hop hi) (Range lo_ lop_ hop_ hi_) =
202goodElm :: Constraint -> Bool
204goodElm :: Constraint -> Bool
203goodElm constraint =
205goodElm constraint =
204− satisfies constraint Compiler.version
206+ satisfies constraint V.compiler
207defaultElm :: Constraint
209defaultElm :: Constraint
208defaultElm =
210defaultElm =
209− if Pkg._major Compiler.version > 0
211+ if V._major V.compiler > 0
210− then untilNextMajor Compiler.version
212+ then untilNextMajor V.compiler
211− else untilNextMinor Compiler.version
213+ else untilNextMinor V.compiler
215-- CREATE CONSTRAINTS
217-- CREATE CONSTRAINTS
218−untilNextMajor :: Version -> Constraint
220+untilNextMajor :: V.Version -> Constraint
219untilNextMajor version =
221untilNextMajor version =
220− Range version LessOrEqual Less (Pkg.bumpMajor version)
222+ Range version LessOrEqual Less (V.bumpMajor version)
223−untilNextMinor :: Version -> Constraint
225+untilNextMinor :: V.Version -> Constraint
224untilNextMinor version =
226untilNextMinor version =
225− Range version LessOrEqual Less (Pkg.bumpMinor version)
227+ Range version LessOrEqual Less (V.bumpMinor version)
228−expand :: Constraint -> Version -> Constraint
230+expand :: Constraint -> V.Version -> Constraint
229expand constraint@(Range lower lowerOp upperOp upper) version
231expand constraint@(Range lower lowerOp upperOp upper) version
230 | version < lower =
232 | version < lower =
231 Range version LessOrEqual upperOp upper
233 Range version LessOrEqual upperOp upper
233 | version > upper =
235 | version > upper =
234− Range lower lowerOp Less (Pkg.bumpMajor version)
236+ Range lower lowerOp Less (V.bumpMajor version)
236 | otherwise =
238 | otherwise =
237 constraint
239 constraint
246+encode :: Constraint -> E.Value
248+ E.string (toString constraint)
251+decoder :: D.Decoder Error Constraint
254+ case fromString str of