summaryrefslogtreecommitdiff
path: root/pkg/config/lib/prelude
diff options
context:
space:
mode:
authorNicolas Paul <n@nc0.fr>2023-05-31 13:22:43 +0200
committerNicolas Paul <n@nc0.fr>2023-05-31 13:23:13 +0200
commit3e64b1b9323ea17eb8f87dfed6d897683c6196be (patch)
treea68e9fe9a6d76751c07747d5f7308edd1930bb8c /pkg/config/lib/prelude
parentde2a79eed5de749470d2d66263f7f9836706f4ec (diff)
Move intern functions into prelude lib to avoid cyclic imports
Signed-off-by: Nicolas Paul <n@nc0.fr>
Diffstat (limited to 'pkg/config/lib/prelude')
-rw-r--r--pkg/config/lib/prelude/prelude.go93
1 files changed, 93 insertions, 0 deletions
diff --git a/pkg/config/lib/prelude/prelude.go b/pkg/config/lib/prelude/prelude.go
new file mode 100644
index 0000000..c1e42f4
--- /dev/null
+++ b/pkg/config/lib/prelude/prelude.go
@@ -0,0 +1,93 @@
+package prelude
+
+import (
+ "fmt"
+ "go.nc0.fr/svgu/pkg/types"
+ "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 types.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.SetDomain(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 types.Vcs
+ switch vcs {
+ case "git":
+ v = types.VcsGit
+ case "hg":
+ v = types.VcsMercurial
+ case "svn":
+ v = types.VcsSubversion
+ case "fossil":
+ v = types.VcsFossil
+ case "bzr":
+ v = types.VcsBazaar
+ default:
+ return nil, fmt.Errorf("unknown vcs %q", vcs)
+ }
+
+ Registered.AddModule(name, types.Module{
+ Path: name,
+ Vcs: v,
+ Repo: repo,
+ Dir: dir,
+ File: file,
+ })
+
+ return starlark.None, nil
+}