1
0
mirror of https://github.com/osmarks/mycorrhiza.git synced 2024-12-12 13:30:26 +00:00
mycorrhiza/hyphae/existing_hypha.go
2022-03-07 20:58:03 +03:00

80 lines
1.9 KiB
Go

package hyphae
import (
"github.com/bouncepaw/mycorrhiza/util"
"os"
"path/filepath"
)
// ExistingHypha is not EmptyHypha. *MediaHypha and *TextualHypha implement this interface.
type ExistingHypha interface {
Hypha
HasTextFile() bool
TextFilePath() string
}
// RenameHyphaTo renames a hypha and renames stored filepaths as needed. The actual files are not moved, move them yourself.
func RenameHyphaTo(h ExistingHypha, newName string, replaceName func(string) string) {
// TODO: that replaceName is suspicious, get rid of it.
newName = util.CanonicalName(newName)
byNamesMutex.Lock()
h.Lock()
delete(byNames, h.CanonicalName())
switch h := h.(type) {
case *TextualHypha:
h.canonicalName = newName
h.mycoFilePath = replaceName(h.mycoFilePath)
case *MediaHypha:
h.canonicalName = newName
h.mycoFilePath = replaceName(h.mycoFilePath)
h.mediaFilePath = replaceName(h.mediaFilePath)
}
byNames[h.CanonicalName()] = h
byNamesMutex.Unlock()
h.Unlock()
}
// DeleteHypha deletes the hypha from the storage.
func DeleteHypha(h ExistingHypha) {
byNamesMutex.Lock()
h.Lock()
delete(byNames, h.CanonicalName())
decrementCount()
byNamesMutex.Unlock()
h.Unlock()
}
// Insert inserts the hypha into the storage, possibly overwriting the previous hypha with the same name. Count incrementation is done if needed. You cannot insert an empty hypha.
func Insert(h ExistingHypha) (madeNewRecord bool) {
_, recorded := byNames[h.CanonicalName()]
byNamesMutex.Lock()
byNames[h.CanonicalName()] = h
byNamesMutex.Unlock()
if !recorded {
incrementCount()
}
return !recorded
}
func WriteToMycoFile(h ExistingHypha, data []byte) error {
if err := os.MkdirAll(filepath.Dir(h.TextFilePath()), 0777); err != nil {
return err
}
if err := os.WriteFile(h.TextFilePath(), data, 0666); err != nil {
return err
}
switch h := h.(type) {
case *MediaHypha:
if !h.HasTextFile() {
h.mycoFilePath = h.TextFilePath()
}
}
return nil
}