+
+func defaultConfigPath() (cfgPath string) {
+ switch runtime.GOOS {
+ case "windows":
+ cfgPath = "config/"
+ case "darwin":
+ if _, err := os.Stat("/usr/local/var/mobius/config/"); err == nil {
+ cfgPath = "/usr/local/var/mobius/config/"
+ } else if _, err := os.Stat("/opt/homebrew/var/mobius/config"); err == nil {
+ cfgPath = "/opt/homebrew/var/mobius/config/"
+ }
+ case "linux":
+ cfgPath = "/usr/local/var/mobius/config/"
+ default:
+ cfgPath = "./config/"
+ }
+
+ return cfgPath
+}
+
+// TODO: Simplify this mess. Why is it so difficult to recursively copy a directory?
+func copyDir(src, dst string) error {
+ entries, err := cfgTemplate.ReadDir(src)
+ if err != nil {
+ return err
+ }
+ for _, dirEntry := range entries {
+ if dirEntry.IsDir() {
+ if err := os.MkdirAll(filepath.Join(dst, dirEntry.Name()), 0777); err != nil {
+ panic(err)
+ }
+ subdirEntries, _ := cfgTemplate.ReadDir(filepath.Join(src, dirEntry.Name()))
+ for _, subDirEntry := range subdirEntries {
+ f, err := os.Create(filepath.Join(dst, dirEntry.Name(), subDirEntry.Name()))
+ if err != nil {
+ return err
+ }
+
+ srcFile, err := cfgTemplate.Open(filepath.Join(src, dirEntry.Name(), subDirEntry.Name()))
+ if err != nil {
+ return err
+ }
+ _, err = io.Copy(f, srcFile)
+ if err != nil {
+ return err
+ }
+ f.Close()
+ }
+ } else {
+ f, err := os.Create(filepath.Join(dst, dirEntry.Name()))
+ if err != nil {
+ return err
+ }
+
+ srcFile, err := cfgTemplate.Open(filepath.Join(src, dirEntry.Name()))
+ if err != nil {
+ return err
+ }
+ _, err = io.Copy(f, srcFile)
+ if err != nil {
+ return err
+ }
+ f.Close()
+ }
+ }
+
+ return nil
+}