aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCamil Staps2017-02-04 00:15:30 +0100
committerCamil Staps2017-02-04 00:15:30 +0100
commit8fd9782b67bd97b33adab00815d215d10382adea (patch)
treeb573af31d974ee646e47f9f124f18edb0c934529
parentInitial commit (diff)
Basic Package structure
-rw-r--r--CLPM/Package.dcl58
-rw-r--r--CLPM/Package.icl58
-rw-r--r--clpm.icl63
-rw-r--r--clpm.json6
4 files changed, 185 insertions, 0 deletions
diff --git a/CLPM/Package.dcl b/CLPM/Package.dcl
new file mode 100644
index 0000000..2a476a7
--- /dev/null
+++ b/CLPM/Package.dcl
@@ -0,0 +1,58 @@
+definition module CLPM.Package
+
+from StdFile import class <<<
+
+from Data.Maybe import :: Maybe
+from Text.JSON import :: JSONNode, generic JSONEncode, generic JSONDecode
+
+:: StoredPackage
+ = { name :: Maybe PackageName
+ , desc :: Maybe Description
+ , author :: Maybe Author
+ , url :: Maybe Url
+ , depends :: Maybe [StoredDependency]
+ }
+
+:: StoredDependency :== (PackageName, StoredPackageSource)
+:: StoredPackageSource :== String
+
+:: Package
+ = { name :: PackageName
+ , desc :: Description
+ , author :: Author
+ , url :: Url
+ , depends :: [Dependency]
+ }
+
+:: Dependency
+ = { dep_name :: PackageName
+ , dep_source :: PackageSource
+ }
+
+:: PackageSource
+ = GitHub String String GitTag
+ | Git Url GitTag
+ | Download Url
+
+:: PackageName :== String
+:: Description :== String
+:: Author :== String
+:: Url :== String
+
+:: GitTag
+ = Commit String
+ | Tag String
+ | Latest
+
+derive JSONEncode StoredPackage
+derive JSONDecode StoredPackage
+
+instance <<< Package
+
+toPackage :: StoredPackage -> Package
+toStoredPackage :: Package -> StoredPackage
+
+DEFAULT_NAME :== "Unnamed package"
+DEFAULT_DESC :== "Empty description"
+DEFAULT_AUTHOR :== "Unknown author"
+DEFAULT_URL :== "http://clean.cs.ru.nl"
diff --git a/CLPM/Package.icl b/CLPM/Package.icl
new file mode 100644
index 0000000..06fae3f
--- /dev/null
+++ b/CLPM/Package.icl
@@ -0,0 +1,58 @@
+implementation module CLPM.Package
+
+import _SystemArray
+import StdFile
+import StdList
+
+import Control.Applicative
+from Data.Func import $
+from Text import class Text(indexOf,subString),
+ instance Text String, instance + String
+import Text.JSON
+
+derive JSONEncode StoredPackage
+derive JSONDecode StoredPackage
+
+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
+ , depends = map toDep $ fromJust $ spkg.StoredPackage.depends <|> Just []
+ }
+where
+ toDep :: StoredDependency -> Dependency
+ toDep (name, src)
+ = { dep_name = name, dep_source = toPackSource src }
+
+ toPackSource :: StoredPackageSource -> PackageSource
+ toPackSource sps = GitHub owner repo Latest
+ where
+ owner = subString 0 slash sps
+ repo = subString (slash + 1) (size sps - 1) sps
+ slash = indexOf "/" sps
+
+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
+ , depends = case map toStoredDep pkg.Package.depends of
+ [] = Nothing
+ ds = Just ds
+ }
+where
+ toStoredDep :: Dependency -> StoredDependency
+ toStoredDep d = (d.dep_name, toStoredPackSource d.dep_source)
+
+ toStoredPackSource :: PackageSource -> StoredPackageSource
+ toStoredPackSource (GitHub o r t) = o + "/" + r
+ // TODO
+
+instance <<< Package
+where
+ (<<<) f p = f <<< (jsonPrettyPrint $ toJSON $ toStoredPackage p)
diff --git a/clpm.icl b/clpm.icl
new file mode 100644
index 0000000..195b135
--- /dev/null
+++ b/clpm.icl
@@ -0,0 +1,63 @@
+module clpm
+
+from StdFunc import flip, o
+import StdFile
+import StdList
+import StdOverloaded
+import StdString
+
+import Control.Applicative
+import Control.Monad
+import Data.Error
+from Data.Func import $
+import Data.Functor
+import Data.Maybe
+import Data.Tuple
+from Text import instance + String
+import Text.JSON
+
+import System.CommandLine
+import System.File
+
+import CLPM.Package
+
+FILENAME :== "clpm.json"
+
+:: Arguments
+ = { package_file :: String
+ }
+
+instance zero Arguments
+where
+ zero
+ = { package_file = FILENAME
+ }
+
+Start w
+# (io,w) = stdio w
+# ((missed, args), w) = appFst (parseArgs [] zero o tl) $ getCommandLine w
+| not (isEmpty missed)
+ # io = foldr (flip (<<<)) io ["Unknown option: " + m + "\n" \\ m <- missed]
+ # (_,w) = fclose io w
+ = w
+# (pkg,w) = readPackage args.package_file w
+| isNothing pkg
+ # io = io <<< "Could not parse " <<< args.package_file <<< '\n'
+ # (_,w) = fclose io w
+ = w
+# pkg = fromJust pkg
+# io = io <<< pkg <<< '\n'
+# (_,w) = fclose io w
+= w
+
+parseArgs :: [String] Arguments [String] -> ([String], Arguments)
+parseArgs miss args []
+ = (miss, args)
+parseArgs miss args ["-p":name:rest]
+ = parseArgs miss {args & package_file = name} rest
+parseArgs miss args [a:rest]
+ = parseArgs [a:miss] args rest
+
+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
diff --git a/clpm.json b/clpm.json
new file mode 100644
index 0000000..74a453d
--- /dev/null
+++ b/clpm.json
@@ -0,0 +1,6 @@
+{
+ "name": "CLPM",
+ "desc": "Clean Package Manger",
+ "author": "Camil Staps",
+ "url": "https://github.com/camilstaps/clpm"
+}