aboutsummaryrefslogtreecommitdiff
path: root/CLPM/Repository.icl
blob: d0b089d4b98d76841408ed87c4ae3406f7356ed2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
implementation module CLPM.Repository

import StdBool
import StdClass
from StdFunc import flip, o
import StdOverloaded

import Control.Applicative
import Control.Monad

import Data.Error
from Data.Func import $
import Data.Functor
import Data.Maybe
import Data.Tuple

import Internet.HTTP

from Text import instance + String
import Text.JSON

import CLPM.Package
import CLPM.Util

derive JSONDecode RepositoryItem, RepositoryItemVersion

getRepository :: Url *World -> *(MaybeErrorString Repository, *World)
getRepository repo w
# (resp,w) = doRequest req w
| isError resp
	= (Error $ fromError resp, w)
# repo = fromJSON $ fromString (fromOk resp).rsp_data
| isNothing repo
	= (Error $ "Server did not return a repository.", w)
= (Ok $ fromJust repo, w)
where
	req =
		{ newHTTPRequest
		& req_path = "/list.php"
		, server_name = REPOSITORY
		, server_port = PORT
		}

getVersions :: (PackageName Repository -> [RepositoryItemVersion])
getVersions = flip (getvs [])
where
	getvs :: [RepositoryItemVersion] Repository PackageName -> [RepositoryItemVersion]
	getvs vs []    p             = vs
	getvs vs [i:r] p
	| i.RepositoryItem.name == p = getvs (vs ++ i.RepositoryItem.versions) r p
	| otherwise                  = getvs  vs                               r p

resolve :: PackageName VersionRequirement Repository -> [RepositoryItemVersion]
resolve p req rep = [v \\ ri <- rep, v <- ri.versions
	| ri.RepositoryItem.name == p && satisfies req v.RepositoryItemVersion.version]