diff options
| author | Nicolas Paul <n@nc0.fr> | 2023-10-01 23:03:40 +0200 |
|---|---|---|
| committer | Nicolas Paul <n@nc0.fr> | 2023-10-02 09:11:12 +0200 |
| commit | aff0b44f520aca6b1a77f6a195072dc10f69b8c8 (patch) | |
| tree | b0dccdcf4c276c9af31178cca2a9afe0c15f6bc0 /prelude.go | |
| parent | 608947dd5b47ac8e2a4ffe37cf2cfcd628f10f00 (diff) | |
Flatten structure
Related to #13
Diffstat (limited to 'prelude.go')
| -rw-r--r-- | prelude.go | 127 |
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 +} |
