diff options
| author | Nicolas Paul <n@nc0.fr> | 2023-05-31 13:22:43 +0200 |
|---|---|---|
| committer | Nicolas Paul <n@nc0.fr> | 2023-05-31 13:23:13 +0200 |
| commit | 3e64b1b9323ea17eb8f87dfed6d897683c6196be (patch) | |
| tree | a68e9fe9a6d76751c07747d5f7308edd1930bb8c /pkg/config/lib/prelude | |
| parent | de2a79eed5de749470d2d66263f7f9836706f4ec (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.go | 93 |
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 +} |
