@@ -1,12 +1,13 @@
11{-# OPTIONS_GHC -Wall #-}
22{-# LANGUAGE OverloadedStrings #-}
3−module Elm.Project.Constraint
3+module Elm.Constraint
44 ( Constraint
55 , exactly
66 , anything
7− , fromText
7+ , toChars
88 , toString
9− , toText
9+ , Error(..)
10+ , fromString
1011 , satisfies
1112 , check
1213 , intersect
@@ -15,18 +16,19 @@ module Elm.Project.Constraint
1516 , untilNextMajor
1617 , untilNextMinor
1718 , expand
19+ , decoder
20+ , encode
1821 )
1922 where
2023
2124
2225import Control.Monad (liftM4)
23−import Data.Binary
24−import qualified Data.Text as Text
25−import Data.Text (Text)
26+import Data.Binary (Binary, get, put, getWord8, putWord8)
27+import qualified Data.Utf8 as Utf8
2628
27−import qualified Elm.Compiler as Compiler
28−import qualified Elm.Package as Pkg
29−import Elm.Package (Version(..))
29+import qualified Elm.Version as V
30+import qualified Json.Decode as D
31+import qualified Json.Encode as E
3032
3133
3234
@@ -34,7 +36,7 @@ import Elm.Package (Version(..))
3436
3537
3638data Constraint
37− = Range Version Op Op Version
39+ = Range V.Version Op Op V.Version
3840 deriving (Eq)
3941
4042
@@ -48,96 +50,96 @@ data Op
4850-- COMMON CONSTRAINTS
4951
5052
51−exactly :: Version -> Constraint
53+exactly :: V.Version -> Constraint
5254exactly version =
5355 Range version LessOrEqual LessOrEqual version
5456
5557
5658anything :: Constraint
5759anything =
58− Range (Version 1 0 0) LessOrEqual LessOrEqual (Version maxBound 0 0)
60+ Range V.one LessOrEqual LessOrEqual V.max
5961
6062
6163
62−-- TEXT CONVERSION
64+-- TO STRING
6365
6466
65−toString :: Constraint -> String
66−toString constraint =
67− Text.unpack (toText constraint)
67+toChars :: Constraint -> String
68+toChars constraint =
69+ Utf8.toChars (toString constraint)
6870
6971
70−toText :: Constraint -> Text
71−toText constraint =
72+toString :: Constraint -> Utf8.String
73+toString constraint =
7274 case constraint of
7375 Range lower lowerOp upperOp upper ->
74− Text.intercalate " "
75− [ Pkg.versionToText lower
76− , opToText lowerOp
76+ Utf8.join 0x20 {- -}
77+ [ V.toString lower
78+ , toStringHelp lowerOp
7779 , "v"
78− , opToText upperOp
79− , Pkg.versionToText upper
80+ , toStringHelp upperOp
81+ , V.toString upper
8082 ]
8183
8284
83−opToText :: Op -> Text
84−opToText op =
85+toStringHelp :: Op -> Utf8.String
86+toStringHelp op =
8587 case op of
86− Less ->
87− "<"
88+ Less -> "<"
89+ LessOrEqual -> "<="
90+
8891
89− LessOrEqual ->
90− "<="
9192
93+-- FROM STRING
9294
93−fromText :: Text -> Either String Constraint
94−fromText text =
95− case Text.splitOn " " text of
95+
96+data Error
97+ = BadLower Utf8.String
98+ | BadUpper Utf8.String
99+ | BadFormat
100+ | InvalidOp
101+ | InvalidRange V.Version V.Version
102+
103+
104+fromString :: Utf8.String -> Either Error Constraint
105+fromString string =
106+ case Utf8.split 0x20 {- -} string of
96107 [lower, lowerOp, "v", upperOp, upper] ->
97− do lo <- versionFromText "lower" lower
98− lop <- opFromText lowerOp
99− hop <- opFromText upperOp
100− hi <- versionFromText "upper" upper
108+ do lo <- versionFromString lower BadLower
109+ lop <- opFromString lowerOp
110+ hop <- opFromString upperOp
111+ hi <- versionFromString upper BadUpper
101112 if lo < hi
102113 then Right (Range lo lop hop hi)
103− else
104− Left $
105− "The lower bound (" ++ Text.unpack lower
106− ++ ") must be less than the upper bound ("
107− ++ Text.unpack upper ++ ")"
114+ else Left (InvalidRange lo hi)
108115
109116 _ ->
110− Left "The standard format is \"1.0.0 <= v < 2.0.0\""
117+ Left BadFormat
111118
112119
113−versionFromText :: String -> Text -> Either String Version
114−versionFromText lowerOrUpper text =
115− case Pkg.versionFromText text of
120+versionFromString :: Utf8.String -> (Utf8.String -> Error) -> Either Error V.Version
121+versionFromString string toError =
122+ case V.fromString string of
116123 Just vsn ->
117124 Right vsn
118125
119126 Nothing ->
120− Left $ "The " ++ lowerOrUpper ++ " bound (" ++ Text.unpack text ++ ") is not a valid version number."
127+ Left (toError string)
121128
122129
123−opFromText :: Text -> Either String Op
124−opFromText text =
130+opFromString :: Utf8.String -> Either Error Op
131+opFromString text =
125132 case text of
126− "<=" ->
127− Right LessOrEqual
128−
129− "<" ->
130− Right Less
131−
132− _ ->
133− Left $ "The operator (" ++ Text.unpack text ++ ") is not valid. Must be (<=) or (<)."
133+ "<=" -> Right LessOrEqual
134+ "<" -> Right Less
135+ _ -> Left InvalidOp
134136
135137
136138
137139-- IS SATISFIED
138140
139141
140−satisfies :: Constraint -> Version -> Bool
142+satisfies :: Constraint -> V.Version -> Bool
141143satisfies constraint version =
142144 case constraint of
143145 Range lower lowerOp upperOp upper ->
@@ -156,7 +158,7 @@ isLess op =
156158 (<=)
157159
158160
159−check :: Constraint -> Version -> Ordering
161+check :: Constraint -> V.Version -> Ordering
160162check constraint version =
161163 case constraint of
162164 Range lower lowerOp upperOp upper ->
@@ -201,43 +203,63 @@ intersect (Range lo lop hop hi) (Range lo_ lop_ hop_ hi_) =
201203
202204goodElm :: Constraint -> Bool
203205goodElm constraint =
204− satisfies constraint Compiler.version
206+ satisfies constraint V.compiler
205207
206208
207209defaultElm :: Constraint
208210defaultElm =
209− if Pkg._major Compiler.version > 0
210− then untilNextMajor Compiler.version
211− else untilNextMinor Compiler.version
211+ if V._major V.compiler > 0
212+ then untilNextMajor V.compiler
213+ else untilNextMinor V.compiler
212214
213215
214216
215217-- CREATE CONSTRAINTS
216218
217219
218−untilNextMajor :: Version -> Constraint
220+untilNextMajor :: V.Version -> Constraint
219221untilNextMajor version =
220− Range version LessOrEqual Less (Pkg.bumpMajor version)
222+ Range version LessOrEqual Less (V.bumpMajor version)
221223
222224
223−untilNextMinor :: Version -> Constraint
225+untilNextMinor :: V.Version -> Constraint
224226untilNextMinor version =
225− Range version LessOrEqual Less (Pkg.bumpMinor version)
227+ Range version LessOrEqual Less (V.bumpMinor version)
226228
227229
228−expand :: Constraint -> Version -> Constraint
230+expand :: Constraint -> V.Version -> Constraint
229231expand constraint@(Range lower lowerOp upperOp upper) version
230232 | version < lower =
231233 Range version LessOrEqual upperOp upper
232234
233235 | version > upper =
234− Range lower lowerOp Less (Pkg.bumpMajor version)
236+ Range lower lowerOp Less (V.bumpMajor version)
235237
236238 | otherwise =
237239 constraint
238240
239241
240242
243+-- JSON
244+
245+
246+encode :: Constraint -> E.Value
247+encode constraint =
248+ E.string (toString constraint)
249+
250+
251+decoder :: D.Decoder Error Constraint
252+decoder =
253+ do str <- D.string
254+ case fromString str of
255+ Right constraint ->
256+ return constraint
257+
258+ Left err ->
259+ D.failure err
260+
261+
262+
241263-- BINARY
242264
243265