0 | module Pack.Core.TOML
2 | import Data.SortedMap as M
3 | import Idris.Package.Types
5 | import Pack.Core.Types
7 | import Text.ParseError
19 | interface Ord a => TOMLKey a where
21 | fromKey : (k : String) -> Either TOMLErr a
24 | TOMLKey DBName where
25 | fromKey s = case Body.parse s of
26 | Just b => Right $
MkDBName b
27 | Nothing => Left $
WrongType [] "collection name"
30 | TOMLKey PkgName where fromKey = Right . MkPkgName
33 | TOMLKey String where fromKey = Right
41 | interface FromTOML a where
43 | fromTOML : File Abs -> (val : TomlValue) -> Either TOMLErr a
52 | tmap : FromTOML a => (a -> b) -> File Abs -> TomlValue -> Either TOMLErr b
53 | tmap f p = map f . fromTOML p
59 | {auto _ : FromTOML a}
60 | -> (a -> Either TOMLErr b)
64 | trefine f p v = fromTOML p v >>= f
79 | (get : TomlValue -> Either TOMLErr a)
82 | -> (val : TomlValue)
84 | valAt' get path dflt = go (forget $
split ('.' ==) path)
87 | go : List String -> TomlValue -> Either TOMLErr a
89 | go (x :: xs) (TTbl y) = case lookup x y of
90 | Nothing => case dflt of
91 | Nothing => Left $
MissingKey [x]
93 | Just v2 => prefixKey x $
go xs v2
94 | go _ _ = Left $
WrongType [] "Table"
101 | {auto _ : FromTOML a}
104 | -> (val : TomlValue)
105 | -> Either TOMLErr a
106 | valAt path f = valAt' (fromTOML f) path Nothing
113 | {auto _ : FromTOML a}
117 | -> (val : TomlValue)
118 | -> Either TOMLErr a
119 | optValAt path f = valAt' (fromTOML f) path . Just
126 | (f : TomlValue -> Either TOMLErr a)
128 | -> (val : TomlValue)
129 | -> Either TOMLErr (Maybe a)
130 | maybeValAt' f path = valAt' (map Just . f) path (Just Nothing)
137 | {auto _ : FromTOML a}
140 | -> (val : TomlValue)
141 | -> Either TOMLErr (Maybe a)
142 | maybeValAt p f = maybeValAt' (fromTOML f) p
149 | FromTOML String where
150 | fromTOML _ (TStr s) = Right s
151 | fromTOML _ _ = Left $
WrongType [] "String"
154 | FromTOML PkgName where fromTOML = tmap MkPkgName
157 | FromTOML URL where fromTOML = tmap MkURL
160 | FromTOML Branch where fromTOML = tmap MkBranch
163 | FromTOML Commit where fromTOML = tmap MkCommit
166 | FromTOML FilePath where fromTOML = tmap fromString
168 | toRelPath : FilePath -> Either TOMLErr (Path Rel)
169 | toRelPath (FP $
PRel sx) = Right (PRel sx)
170 | toRelPath (FP $
PAbs _ _) = Left (WrongType [] "Relative Path")
172 | toRelFile : FilePath -> Either TOMLErr (File Rel)
173 | toRelFile (FP $
PRel (sx :< x)) = Right (MkF (PRel sx) x)
174 | toRelFile _ = Left (WrongType [] "relative file path")
177 | FromTOML (Path Rel) where fromTOML = trefine toRelPath
179 | toLogLevel : String -> Either TOMLErr LogLevel
180 | toLogLevel s = case lookup s logLevels of
181 | Just lvl => Right lvl
182 | Nothing => Left (WrongType [] "log level")
185 | FromTOML LogLevel where fromTOML = trefine toLogLevel
188 | FromTOML (File Rel) where fromTOML = trefine toRelFile
191 | FromTOML DBName where fromTOML = trefine fromKey
194 | FromTOML Bool where
195 | fromTOML _ (TBool b) = Right b
196 | fromTOML _ _ = Left $
WrongType [] "Bool"
199 | FromTOML a => FromTOML (List a) where
200 | fromTOML f (TArr vs) = traverse (fromTOML f) vs
201 | fromTOML _ _ = Left $
WrongType [] "Array"
203 | readVersion : String -> Either TOMLErr PkgVersion
204 | readVersion s = case traverse parsePositive $
split ('.' ==) s of
205 | Just ns => Right $
MkPkgVersion ns
206 | Nothing => Left $
WrongType [] "Package Version"
209 | FromTOML PkgVersion where
210 | fromTOML = trefine readVersion
213 | {auto _ : TOMLKey k}
214 | -> (TomlValue -> Either TOMLErr v)
215 | -> (String,TomlValue)
216 | -> Either TOMLErr (k,v)
217 | keyVal f (x,y) = prefixKey x [| MkPair (fromKey x) (f y) |]
220 | TOMLKey k => FromTOML v => FromTOML (SortedMap k v) where
221 | fromTOML f (TTbl m) =
222 | M.fromList <$> traverse (keyVal $
fromTOML f) (M.toList m)
223 | fromTOML _ _ = Left $
WrongType [] "Table"
226 | FromTOML (Path Abs) where
227 | fromTOML f v = toAbsPath f.parent <$> fromTOML f v
230 | FromTOML (File Abs) where
231 | fromTOML f v = toAbsFile f.parent <$> fromTOML f v
239 | readTOML : HasIO io => File Abs -> EitherT PackErr io TomlValue
242 | case parseString toml (FileSrc "\{file}") str of
243 | Right v => pure (TTbl v)
244 | Left x => throwE $
TOMLParse "\{x}"
250 | {auto _ : HasIO io}
252 | -> {auto _ : FromTOML a}
254 | -> EitherT PackErr io a
255 | readFromTOML _ file = do
257 | liftEither $
mapFst (TOMLFile file) (fromTOML file v)
262 | readOptionalFromTOML :
263 | {auto _ : HasIO io}
265 | -> {auto _ : FromTOML a}
267 | -> EitherT PackErr io a
268 | readOptionalFromTOML a f = do
269 | True <- fileExists f
270 | | False => liftEither (mapFst (TOMLFile f) $
fromTOML f (TTbl empty))