summaryrefslogtreecommitdiff
path: root/prelude.go
diff options
context:
space:
mode:
authorNicolas Paul <n@nc0.fr>2023-10-01 23:03:40 +0200
committerNicolas Paul <n@nc0.fr>2023-10-02 09:11:12 +0200
commitaff0b44f520aca6b1a77f6a195072dc10f69b8c8 (patch)
treeb0dccdcf4c276c9af31178cca2a9afe0c15f6bc0 /prelude.go
parent608947dd5b47ac8e2a4ffe37cf2cfcd628f10f00 (diff)
Flatten structure
Related to #13
Diffstat (limited to 'prelude.go')
-rw-r--r--prelude.go127
1 files changed, 127 insertions, 0 deletions
diff --git a/prelude.go b/prelude.go
new file mode 100644
index 0000000..d109a82
--- /dev/null
+++ b/prelude.go
@@ -0,0 +1,127 @@
+// Copyright Nicolas Paul (2023)
+//
+// * Nicolas Paul
+//
+// This software is a computer program whose purpose is to allow the hosting
+// and sharing of Go modules using a personal domain.
+//
+// This software is governed by the CeCILL license under French law and
+// abiding by the rules of distribution of free software. You can use,
+// modify and/ or redistribute the software under the terms of the CeCILL
+// license as circulated by CEA, CNRS and INRIA at the following URL
+// "http://www.cecill.info".
+//
+// As a counterpart to the access to the source code and rights to copy,
+// modify and redistribute granted by the license, users are provided only
+// with a limited warranty and the software's author, the holder of the
+// economic rights, and the successive licensors have only limited
+// liability.
+//
+// In this respect, the user's attention is drawn to the risks associated
+// with loading, using, modifying and/or developing or reproducing the
+// software by the user in light of its specific status of free software,
+// that may mean that it is complicated to manipulate, and that also
+// therefore means that it is reserved for developers and experienced
+// professionals having in-depth computer knowledge. Users are therefore
+// encouraged to load and test the software's suitability as regards their
+// requirements in conditions enabling the security of their systems and/or
+// data to be ensured and, more generally, to use and operate it in the
+// same conditions as regards security.
+//
+// The fact that you are presently reading this means that you have had
+// knowledge of the CeCILL license and that you accept its terms.
+
+// Prelude for the Starlark environment.
+
+package main
+
+import (
+ "fmt"
+ "go.starlark.net/starlark"
+ "strings"
+)
+
+// https://stackoverflow.com/questions/1976007/what-characters-are-forbidden-in-windows-and-linux-directory-names
+const invalidName string = "..\\/<>:\"|?* \t\n\r\b\findex"
+
+// Registered represents the index of registered modules.
+var Registered Index
+
+// InternIndex represents the built-in function "index".
+// index(domain) initializes a new index with the given domain.
+func InternIndex(_ *starlark.Thread, _ *starlark.Builtin, args starlark.Tuple,
+ kwargs []starlark.Tuple) (starlark.Value, error) {
+ var domain string
+ if err := starlark.UnpackArgs("index", args, kwargs,
+ "domain", &domain); err != nil {
+ return nil, err
+ }
+
+ Registered.Domain = domain
+
+ return starlark.None, nil
+}
+
+// InternModule represents the built-in function "module".
+// module(name, vcs, repo, dir, file) registers a new module into the
+// index.
+func InternModule(_ *starlark.Thread, _ *starlark.Builtin, args starlark.Tuple,
+ kwargs []starlark.Tuple) (starlark.Value, error) {
+
+ var name, vcs, repo, dir, file string
+ if err := starlark.UnpackArgs("module", args, kwargs, "name",
+ &name, "vcs", &vcs, "repo", &repo, "dir", &dir, "file", &file); err != nil {
+ return nil, err
+ }
+
+ if Registered.Domain == "" {
+ return nil, fmt.Errorf("index not initialized")
+ }
+
+ if name == "" {
+ return nil, fmt.Errorf("module name cannot be empty")
+ }
+
+ if vcs == "" {
+ return nil, fmt.Errorf("module %q vcs cannot be empty", name)
+ }
+
+ if repo == "" {
+ return nil, fmt.Errorf("module %q repo cannot be empty", name)
+ }
+
+ // Check for name conditions.
+ if strings.Contains(invalidName, name) {
+ return nil, fmt.Errorf("module %q name is invalid", name)
+ }
+
+ if Registered.CheckModule(name) {
+ return nil, fmt.Errorf("module %q already exists", name)
+ }
+
+ var v Vcs
+ switch vcs {
+ case "git":
+ v = VcsGit
+ case "hg":
+ v = VcsMercurial
+ case "svn":
+ v = VcsSubversion
+ case "fossil":
+ v = VcsFossil
+ case "bzr":
+ v = VcsBazaar
+ default:
+ return nil, fmt.Errorf("unknown vcs %q", vcs)
+ }
+
+ Registered.AddModule(name, &Module{
+ Path: name,
+ Vcs: v,
+ Repo: repo,
+ Dir: dir,
+ File: file,
+ })
+
+ return starlark.None, nil
+}