aboutsummaryrefslogtreecommitdiff
path: root/CLPM/Package.icl
blob: 2eee2076731c6825c01f101b780f9abba8054a5d (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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
implementation module CLPM.Package

import _SystemArray
import StdFile
from StdFunc import o
import StdList

import Control.Applicative
import Control.Monad

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

import System.File
import System.FilePath

from Text import class Text(indexOf,subString),
	instance Text String, instance + String
import Text.JSON

derive JSONEncode StoredPackage, StoredOptions
derive JSONDecode StoredPackage, StoredOptions

:: StoredPackage
	= { name    :: Maybe PackageName
	  , desc    :: Maybe Description
	  , author  :: Maybe Author
	  , url     :: Maybe Url
	  , main    :: Maybe Path
	  , depends :: Maybe [StoredDependency]
	  , paths   :: Maybe [Path]
	  , options :: Maybe StoredOptions
	  }

:: StoredDependency :== (PackageName, StoredPackageSource)
:: StoredPackageSource :== String

:: StoredOptions
	= { show_result       :: Maybe Bool
	  , show_constructors :: Maybe Bool
	  , show_time         :: Maybe Bool
	  , heap_size         :: Maybe Int
	  , stack_size        :: Maybe Int
	  , extra_flags       :: Maybe [String]
	  }

toPackage :: StoredPackage -> Package
toPackage spkg
	= { Package
	  | name    = fromJust $ spkg.StoredPackage.name <|> Just DEFAULT_NAME
	  , desc    = fromJust $ spkg.StoredPackage.desc <|> Just DEFAULT_DESC
	  , author  = fromJust $ spkg.StoredPackage.author <|> Just DEFAULT_AUTHOR
	  , url     = fromJust $ spkg.StoredPackage.url <|> Just DEFAULT_URL
	  , main    = fromJust $ spkg.StoredPackage.main <|> Just DEFAULT_MAIN
	  , depends = map toDep $ fromJust $ spkg.StoredPackage.depends <|> Just []
	  , paths   = fromJust $ spkg.StoredPackage.paths <|> Just DEFAULT_PATHS
	  , options = toOptions spkg.StoredPackage.options
	  }
where
	toDep :: StoredDependency -> Dependency
	toDep (name, src)
		= { dep_name = name, dep_source = toPackSource src }

	toPackSource :: StoredPackageSource -> PackageSource
	toPackSource sps = Git sps Latest

	toOptions :: (Maybe StoredOptions) -> Options
	toOptions Nothing = DEFAULT_OPTIONS
	toOptions (Just opts) =
		{ Options
		| show_result       = fromJust $
			opts.StoredOptions.show_result <|>
			Just DEFAULT_OPTIONS.Options.show_result
		, show_constructors = fromJust $
			opts.StoredOptions.show_constructors <|>
			Just DEFAULT_OPTIONS.Options.show_constructors
		, show_time = fromJust $
			opts.StoredOptions.show_time <|>
			Just DEFAULT_OPTIONS.Options.show_time
		, heap_size = fromJust $
			opts.StoredOptions.heap_size <|>
			Just DEFAULT_OPTIONS.Options.heap_size
		, stack_size = fromJust $
			opts.StoredOptions.stack_size <|>
			Just DEFAULT_OPTIONS.Options.stack_size
		, extra_flags = fromJust $
			opts.StoredOptions.extra_flags <|>
			Just DEFAULT_OPTIONS.Options.extra_flags
		}

toStoredPackage :: Package -> StoredPackage
toStoredPackage pkg
	= { StoredPackage
	  | name    = Just pkg.Package.name
	  , desc    = Just pkg.Package.desc
	  , author  = Just pkg.Package.author
	  , url     = Just pkg.Package.url
	  , main    = Just pkg.Package.main
	  , depends = listToMaybeList $ map toStoredDep pkg.Package.depends
	  , paths   = listToMaybeList pkg.Package.paths
	  , options = Just $ toStoredOpts pkg.Package.options
	  }
where
	listToMaybeList :: [a] -> Maybe [a]
	listToMaybeList [] = Nothing
	listToMaybeList xs = Just xs

	toStoredDep :: Dependency -> StoredDependency
	toStoredDep d = (d.dep_name, toStoredPackSource d.dep_source)

	toStoredPackSource :: PackageSource -> StoredPackageSource
	toStoredPackSource (Git url t) = url
	// TODO

	toStoredOpts :: Options -> StoredOptions
	toStoredOpts opts =
		{ StoredOptions
		| show_result       = Just opts.Options.show_result
		, show_constructors = Just opts.Options.show_constructors
		, show_time         = Just opts.Options.show_time
		, heap_size         = Just opts.Options.heap_size
		, stack_size        = Just opts.Options.stack_size
		, extra_flags       = listToMaybeList opts.Options.extra_flags
		}

instance <<< Package
where
	(<<<) f p = f <<< (jsonPrettyPrint $ toJSON $ toStoredPackage p)

readPackage :: String -> *World -> *(Maybe Package, *World)
readPackage f = appFst parse o readFile f
where parse = join o fmap (fmap toPackage o fromJSON o fromString) o error2mb

getRecursivePaths :: Package *World -> (MaybeErrorString [Path], *World)
getRecursivePaths pkg w = getPaths` pkg.Package.paths [] pkg.Package.depends w
where
	getPaths` :: [Path] [Package] [Dependency] *World
		-> (MaybeErrorString [Path], *World)
	getPaths` ps _   []     w = (Ok ps, w)
	getPaths` ps pks [d:ds] w
	| isMember d.dep_name [p.Package.name \\ p <- pks]
		= getPaths` ps pks ds w
	# (pkg,w) = readPackage (MODULE_DIR </> d.dep_name </> PACKAGE_FILE) w
	| isNothing pkg
		= (Error $ "Could not read " + PACKAGE_FILE + " for " + d.dep_name + ".",w)
	# pkg = fromJust pkg
	= getPaths` (removeDup $ ps ++ pkg.Package.paths) [pkg:pks] ds w

optionsToFlags :: Options -> [String]
optionsToFlags opts
	= if opts.Options.show_result [] ["-nr"]
	++ if opts.Options.show_constructors ["-sc"] ["-b"]
	++ if opts.Options.show_time ["-t"] ["-nt"]
	++ ["-h " + toString opts.Options.heap_size + "k"]
	++ ["-s " + toString opts.Options.stack_size + "k"]
	++ opts.Options.extra_flags