mirror of
https://github.com/osmarks/mycorrhiza.git
synced 2024-10-30 11:46:16 +00:00
108 lines
2.4 KiB
Go
108 lines
2.4 KiB
Go
package mycelium
|
|
|
|
import (
|
|
"io/ioutil"
|
|
"log"
|
|
"strings"
|
|
|
|
"github.com/bouncepaw/mycorrhiza/cfg"
|
|
)
|
|
|
|
var (
|
|
MainMycelium string
|
|
SystemMycelium string
|
|
)
|
|
|
|
func gatherDirNames(path string) map[string]struct{} {
|
|
res := make(map[string]struct{})
|
|
nodes, err := ioutil.ReadDir(path)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
for _, node := range nodes {
|
|
if node.IsDir() {
|
|
res[node.Name()] = struct{}{}
|
|
}
|
|
}
|
|
return res
|
|
}
|
|
|
|
// Add values to the set. If a value is already there, return false.
|
|
func addInUniqueSet(set map[string]struct{}, names []string) bool {
|
|
ok := true
|
|
for _, name := range names {
|
|
if _, present := set[name]; present {
|
|
ok = false
|
|
}
|
|
set[name] = struct{}{}
|
|
}
|
|
return ok
|
|
}
|
|
|
|
func Init() {
|
|
var (
|
|
// Used to check if there are no duplicates
|
|
foundNames = make(map[string]struct{})
|
|
dirs = gatherDirNames(cfg.WikiDir)
|
|
mainPresent bool
|
|
systemPresent bool
|
|
)
|
|
for _, mycelium := range cfg.Mycelia {
|
|
switch mycelium.Type {
|
|
case "main":
|
|
mainPresent = true
|
|
MainMycelium = mycelium.Names[0]
|
|
case "system":
|
|
systemPresent = true
|
|
SystemMycelium = mycelium.Names[0]
|
|
}
|
|
// Check if there is a dir corresponding to the mycelium
|
|
if _, ok := dirs[mycelium.Names[0]]; !ok {
|
|
log.Fatal("No directory found for mycelium " + mycelium.Names[0])
|
|
}
|
|
// Confirm uniqueness of names
|
|
if ok := addInUniqueSet(foundNames, mycelium.Names); !ok {
|
|
log.Fatal("At least one name was used more than once for mycelia")
|
|
}
|
|
}
|
|
if !mainPresent {
|
|
log.Fatal("No `main` mycelium given in config.json")
|
|
}
|
|
if !systemPresent {
|
|
log.Fatal("No `system` mycelium given in config.json")
|
|
}
|
|
log.Println("Mycelial dirs are present")
|
|
}
|
|
|
|
func NameWithMyceliumInMap(m map[string]string) (res string) {
|
|
var (
|
|
hyphaName, okH = m["hypha"]
|
|
mycelName, okM = m["mycelium"]
|
|
)
|
|
log.Println(m)
|
|
if !okH {
|
|
// It will result in an error when trying to open a hypha with such name
|
|
return ":::"
|
|
}
|
|
if okM {
|
|
res = canonicalMycelium(mycelName)
|
|
} else {
|
|
res = MainMycelium
|
|
}
|
|
return res + "/" + hyphaName
|
|
}
|
|
|
|
func canonicalMycelium(name string) string {
|
|
log.Println("Determining canonical mycelial name for", name)
|
|
name = strings.ToLower(name)
|
|
for _, mycel := range cfg.Mycelia {
|
|
for _, mycelName := range mycel.Names {
|
|
if mycelName == name {
|
|
return mycel.Names[0]
|
|
}
|
|
}
|
|
}
|
|
// This is a nonexistent mycelium. Return a name that will trigger an error
|
|
return ":error:"
|
|
}
|